Array 這種東西,經典而入門,就像便當盒中的配菜,連續的被擺放在一起
Array 的好處就是當知道哪到菜在哪個空間時,可以已最快的 O(1) 取得,但如果要把一個配菜給清空,那就得花上一定的時間,當然多加一個菜色也是。
而在記憶體中,之所以為造成這樣的問題,是因為必須先產生一個新的 Array,並在複製過來,才會造成時間的消耗
例題 1:Find the Missing Number
一個經典的問題,給定一個從 1 到 n 的 Array,但有 1 個元素消失,可以利用 total = n*(n+1)/2
或是 bitwise 的作法,找出消失的元素,當然也可以暴力的利用建一個全新的 1 到 n 的 Array 並比較啦XD
做法 1:
利用總和找出少掉的數字
int missingNumber(vector<int> &nums)
{
int total = (n + 1) * (n + 2) / 2;
for (int i = 0; i < n; i++)
total -= a[i];
return total;
}
做法 2:
先將 x1 與所有數做 XOR,再將 x2 與所有數 XOR,透過 XOR 的特性,會消去相同的數字,得到少掉的數字
int missingNumber(vector<int> &nums)
{
int n = nums.size();
int x1 = nums[0];
for (int i = 1; i < n; i++)
x1 = x1 ^ nums[i];
int x2 = 1; // 若從 0 開始,改為 int x2 = 0;
for (int i = 1; i <= n + 1; i++) // 若從 0 開始,i < n + 1
x2 = x2 ^ i;
return (x1 ^ x2);
}