題目:在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。
1> 交換查詢
步驟: 重排陣列:
複雜度:
陣列排序中儘管兩重迴圈,每個數字最多交換兩次就可以找到位置,時間複雜度為o(n)
操作在輸入陣列,不需額外分哦欸記憶體,空間複雜度o(1)
for (int i = 0; i < length; ++i) //* 陣列元素不合法 }
for (int i = 0; i < length; ++i)
//交換numbers[i]和number[numbers[i]]
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
} }return false;
}void main()
; int len = sizeof(numbers) / sizeof(int);
int duplication;
duplicate(numbers, len, &duplication);
}2>雜湊查詢
從頭到尾掃瞄陣列,每掃瞄到乙個數字,判斷該數字是否在雜湊表中,如果該雜湊表還沒有這個數字,那麼加入雜湊表,如果已經存在,則返回該重複的數字;
演算法時間複雜度:o(n),空間複雜度:o(n)。
unordered_map的內部實現方式為雜湊表。
#include #include "stdlib.h"
#include using namespace std;
int main()
; int len = sizeof(numbers) / sizeof(numbers[0]);
int flag = 0;//是否找到重複數字的標誌位
std::unordered_maphashmap = {};
for (int i = 0; i < len; i++)
); }
else
}if (flag == 1)
break;
else
hashmap.insert();
} }system("pause");
return 0;
}
3> 排序查詢
a 把輸入陣列排序 o(nlogn)
b 遍歷排序陣列
排序演算法時間複雜度:o(nlogn),空間複雜度:o(1)。
stl庫的sort()函式具體實現結合了快速排序,插入排序和堆排序。
#include#include#include//sort
using namespace std;
int main()
std::sort(number.begin(),number.end());
for (std::vector::iterator it = number.begin(); it != number.end(); ++it) }
system("pause");
//for (auto i:number) //輸出vector的元素
// cout <
return 0;
}
劍指offer 面試題3
思路 從左下角或者右上角開始比較 簡單版本 查詢方式從右上角開始查詢 如果當前元素大於target,左移一位繼續查詢 如果當前元素小於target,下移一位繼續查詢 進行了簡單的修改,可以判定輸入型別為字元的情況 查詢方式從左下角開始查詢 如果當前元素大於target,上移一位繼續查詢 如果當前元素...
劍指offer面試題3
前言 從最近的比賽中,真的可以看出來自己做題目太少了,一些常見的演算法,思路都不怎麼會,接下來要好好努力了 分析 書中給的分析思路很好,要解決乙個複雜的問題,最有效的方法就是從乙個具體的問題入手,這道題就可以舉例子,查詢7這個元素,首先從右上角開始,9比7大,所以9所在的列不會有,查詢8,比7大,所...
劍指offer面試題 一
拿到這樣一道題目,如何去分析呢?我們通過觀察替換前和替換後的字串發現,原本空格的位置被替換成了三個字元 20,如果我們從前往後遇到空格就替換,那仫很容易導致後面的記憶體被覆蓋,那仫如何才能解決這個問題呢?並且這個問題也存在記憶體分配的問題,如果面試官告訴你記憶體足夠大,那仫你就可以盡情的使用記憶體啦...