今天主要學習了複雜度和作了2道題目
複雜度主要分爲時間複雜度和空間複雜度
時間複雜度不是追求具體的執行時間,而是大體的計算基本語句執行的次數,用O()表示。
須要注意的是
一、係數能夠忽略。
2.O(1)不是表示執行了一次,而是執行的次數爲次數,通寫爲O(1),這一點須要特備註意。
空間複雜度計算的不是空間大小,而是計算變量的個數,同時也要注意O(1)不是表示只有一個變量,而是變量的個數爲常數。
題目一:0-n的數組中消失了一個數,求數組中消失的一個數。
這道題的方法有不少,可是針對時間複雜度,最好用異或來作,經過讓缺乏一個數的數組中每一個元素都相互異或,再將異或的結果與完整的數組異或,就能夠獲得消失的數。(異或,相同爲0,不一樣爲1,異或是位運算,得一位位得比)
題目二:一個數組中,只有2個數出現了一次,其他的都出現了2次,求只出現一次的2個數。
思想主要是
一、將數組中的每一個元素都異或,獲得的結果爲出現一次的2個數的異或結果ret。
二、找出ret的中任意位置爲1的位,由於若是有一位爲1,說明這個位的對於這2個數是不同。
三、根據找到的位來將數組中全部數分離,該位爲1的在一組,爲0 的在一組。
四、將2組分別異或,獲得的就是剩下的2個數。
關鍵代碼:
while(m<32)
{
if(ret&(1<<m))
break;
else
m++;
} 這一段代碼 是求出ret的m位爲1;
for(i=0;i<numssize;i++)
{
if(nums[i]&(1<<i))
x1^=nums[i];
else
x2^=nums[i];
}這一段代碼是將m位爲1的和m位爲0的分開出來,並分別異或。
另外注意一下 返回值應該是是一個數組的地址,由於要獲得這2個數,得用數組保存起來,可是數組得起初大小不知道,因此使用動態內存開闢一個內存,即malloc()開闢。數組