《劍指offer》面試題3(一) 陣列中重複的數字

2021-08-22 05:04:44 字數 1963 閱讀 6107

題目:在乙個長度為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,如果我們從前往後遇到空格就替換,那仫很容易導致後面的記憶體被覆蓋,那仫如何才能解決這個問題呢?並且這個問題也存在記憶體分配的問題,如果面試官告訴你記憶體足夠大,那仫你就可以盡情的使用記憶體啦...