1. 二进制中1 的个数
int NumberOf1(int n)
{
int count = 0;
while (n)
{
++ count;
n = (n-1) & n;
}
return count;
}
2. 出现次数超过一半的数字
利用标记,相邻相同就是加1,不同减1
一个数字,一个次数
3. 找到最小的K 个数字
维护一个大小为K 的 二叉树容器,最大的值与数组中数字比较,小则放入容器
4. 连续子数组的最大和
动态规划, f(i) = f(i - 1) + pData[i] (i!= 0 || f(i-1)>0) // pData[i] (i==0 || f(i-1) <=0)
maxSub(int data[], int n)
{
if(n <0 ) return
if (n ==0) ruturn data[i]
if( sum[n-1] <=0) return data[i]
if( sum[n-1] > 0 ) return sum[n-1] + data[i]
}
5. 求数列中满足条件的数,比如数列1~10,中满足相加和为10 的数列
思路: 利用01背包问题解法,即放入某个数或者不放入某个数
list<int> listUse;
void find_factor(int sum, int n)
{
if(n<=0 || sum<= 0)
return;
if(sum ==n)
{
// listUse.reverse();
for(list<int>::iterator iter = listUse.begin(); iter != listUse.end(); iter++)
cout<<*iter<<"+";
cout<<n<<endl;
// listUse.reverse();
}
listUse.push_front(n);
find_factor(sum-n,n-1);
listUse.pop_front();
find_factor(sum,n-1);
}
int main()
{
int sum = 10, n = 10;
find_factor(sum,n);
return 0 ;
}