題目描述
在乙個長度為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。其...