枚举算法入门
在某个可能的解的集合中,按某个顺序依次检索元素,用题目给定的条件进行校验和计算。
是否存在,找到第一个,全部都,全部都不。
原数组中是否存在子数组?(元素无需连续,但需保持相对顺序一致)templata<typename T>
bool subMatch(const T&arr,const T&target){
size_t idx=0;
for (auto &elem : arr)
{
if(elem==target[idx])
{
if(++idx == target.size())
return true;
}
}
return false;
}
寻找第K小的素数?for(int idx=1;;idx++)
{
if(isPrime(idx))
cnt++;
if(cnt==k)
{
cout<<idx;
break;
}
}
枚举的优化:裁剪枚举集
判断一个数是否为素数?for(int i=2;i<=n-1;i++)
{
if(n%i == 0)
return false;
}
根据数学特性可以缩小枚举范围for(int i=2;i<=sqrt(n);i++)
{
if(n%i == 0)
return false;
}
按位枚举:
比如枚举十进制数1234的每一位while(x){
int dight = x % 10;
// do something
x /=10;
}
对于将十进制整数 x 转换为 base 进制的各位数字,把10改为对应的进制数vector<int> arr1;
while(x){
int dight = x % base;
arr1.push_back(dight);
x /=base;
}
将 base 进制的逆序数字转换回十进制整数int x=0;
for(int i=arr1.size()-1;i>=0;i--)
{
x = x * base +arr1[i];
}
return x;
