劍指offer演算法題(二)陣列中重複的數字

2021-08-20 12:57:34 字數 1246 閱讀 4895

題目描述

在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。

解題思路1:

由於所有數字都在 0~n-1 之間,因此,當乙個數字被訪問過後,可以設定對應位上的數 + n,之後再遇到相同的數時,會發現對應位上的數已經大於等於n了,那麼直接返回這個數即可。

**實現:

class solution                                   

}return

false;

}};

優點:演算法複雜度低:時間演算法複雜度 o(

n)o (n

),不需要額外空間。

缺點:可能出現溢位情況,對原陣列進行了修改。

解題思路2:

使用長度為n的記錄陣列 ,初始值設為0, 遍歷原陣列,每個數字都在記錄的陣列上+1,若記錄陣列上的該數字已經等於1,返回該數。

**實現:

class solution 

}return

false;

}};

優點:時間演算法複雜度 o(

n)o (n

),不改變原陣列。

缺點:空間複雜度高,需要 o(

n)o (n

)。

解題思路3

例子:

第0個和第2個比較,交換

第0個和第1個比較,交換

第0個和第3個比較,交換

第0個是0,第1個是1,第2個是2,第3個是3

第4個是2,第2個也是2,找到重複數字,返回

**實現:

class solution 

for(int i=0;iint tmp = numbers[i];

numbers[i] = numbers[tmp];

numbers[tmp] = tmp;

}

}return

false;

}};

優點:演算法複雜度低:時間演算法複雜度 o(

n)o (n

),不需要額外空間;不會出現溢位情況。

缺點:對原陣列進行了修改。

《劍指offer》二維陣列題

本文完全自己學習記錄,以便將來回顧 未排版 思路 從最後一列的首行開始與number比較 比如上圖中的數字9 若大於該number,則此列可跳過,繼續比較前面一列首行數字,若大於number繼續上一步,若小於,則看此列下一行數字,若找到則true,若此列遇到大於number的數字,還未找到numbe...

劍指offer第二題

最直觀的做法是從頭往後開始掃瞄,但是這樣複雜度為o n 2 o n 的做法是從後往前開始複製和替換。先求出替換後的字串大小,然後用兩個指標 index 從後往前複製,如果遇上空格,直接替換為 20 public class solution int oldindex str.length 1 int...

劍指offer第二題

請實現乙個函式,將乙個字串中的空格替換成 20 例如,當字串為 則經過替換之後的字串為 分析 考場陣列的操作,主要是從頭到尾的操作要消耗o n 複雜度,如果完成插值,則為o n2 所以要從尾部倒過來轉移。注意 本題有兩點要考慮。其一,注意錯誤的返回值為return,而不是return false。其...