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 ;
}