【五星】
leetcode:移動零
題目描述:
給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
思想:
直接在正確的位置賦值,覆蓋掉的數不影響最終結果,最後騰出的幾位都賦值0
**:
class solution
for(;ileetcode:重塑矩陣
題目描述:
在matlab中,有乙個非常有用的函式 reshape,它可以將乙個矩陣重塑為另乙個大小不同的新矩陣,但保留其原始資料。
給出乙個由二維陣列表示的矩陣,以及兩個正整數r和c,分別表示想要的重構的矩陣的行數和列數。
重構後的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。
如果具有給定引數的reshape操作是可行且合理的,則輸出新的重塑矩陣;否則,輸出原始矩陣。
示例:輸入:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
輸出:
[[1,2,3,4]]
解釋:行遍歷nums的結果是 [1,2,3,4]。新的矩陣是 1 * 4 矩陣, 用之前的元素值一行一行填充新矩陣。
思想:
這題沒啥精妙的思想,就是有點複雜。
注意:index可以累加,不用每次都計算**:
class solution
}return ret;
}}
優先佇列,堆解法
class solution
@override
public int compareto(item o)
}}
【五星】
leetcode:尋找重複數
題目描述:
給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。
注意:1.不能更改原陣列(假設陣列是唯讀的)。
2.只能使用額外的 o(1) 的空間。
3.時間複雜度小於 o(n2) 。
4.陣列中只有乙個重複的數字,但它可能不止重複出現一次。
示例:
輸入: [1,3,4,2,2]
輸出: 2
輸入: [3,1,3,4,2]
輸出: 3
思想:
因為重複數字可能不止出現一次,所以不能按照 錯誤的集合 這題的做法來做,即使用位運算。
該種陣列形式可以抽象成乙個帶環的鍊錶。本題可以抽象成,求環入口的問題。思想如下
**:
class solution
slow = 0;
while(slow!=fast)
return slow;
}}
【五星】
leetcode:陣列相鄰差值的個數
題目描述:
給定兩個整數 n 和 k,你需要實現乙個陣列,這個陣列包含從 1 到 n 的 n 個不同整數,同時滿足以下條件:
① 如果這個陣列是 [a1, a2, a3, ... , an] ,那麼陣列 [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] 中應該有且僅有 k 個不同整數;.
② 如果存在多種答案,你只需實現並返回其中任意一種.
示例:
輸入: n = 3, k = 2
輸出: [1, 3, 2]
解釋: [1, 3, 2] 包含 3 個範圍在 1-3 的不同整數, 並且 [2, 1] 中有且僅有 2 個不同整數: 1 和 2
思想:
前k+1個數這樣排列:1,1+k,2,k,3,k-1......可滿足條件,後面的位置按順序排
例如k為4的情況,1,5,3,2,4的差值分別是4,3,2,1滿足題設。
憑感覺這樣是對的但不知道怎麼證明。
興許可以按照以下思路來思考:
完成以上思路,需要解決乙個問題,如何保證前k+1個數排完之後,後面的數不會出現新的差值?因為第k+2個數值為k+2,它與前乙個數的差值不可能大於k,除非前乙個數是1,但1是排在首位的,不可能有這樣的情況。
**:
class solution 且遵守以下的規則。
假設選擇索引為i的元素a[i]為s的第乙個元素,s的下乙個元素應該是a[a[i]],之後是a[a[a[i]]]... 以此類推,不斷新增直到s出現重複的元素。
示例:輸入: a = [5,4,0,3,1,6,2]
輸出: 4
解釋:
a[0] = 5, a[1] = 4, a[2] = 0, a[3] = 3, a[4] = 1, a[5] = 6, a[6] = 2.
其中一種最長的 s[k]:
s[0] = =
思想:
可以把這種結構理解成煉表,整個陣列遍歷下來一定是幾個環形鍊錶。兩層迴圈,外層遍歷每個環形鍊錶,內層遍歷環形鍊錶的每個結點。
因為多個環狀鍊錶互不相交,所以,每次訪問時,把陣列中的元素標記為-1,下次不用再訪問,可大大縮減迴圈次數。
**:
class solution
return res;
}}
【五星】
leetcode:最多能完成排序的塊
題目描述:
陣列arr是[0, 1, ..., arr.length - 1]的一種排列,我們將這個陣列分割成幾個「塊」,並將這些塊分別進行排序。之後再連線起來,使得連線的結果和按公升序排序後的原陣列相同。
我們最多能將陣列分成多少塊?
示例:
輸入: arr = [4,3,2,1,0]
輸出: 1
解釋:將陣列分成2塊或者更多塊,都無法得到所需的結果。
例如,分成 [4, 3], [2, 1, 0] 的結果是 [3, 4, 0, 1, 2],這不是有序的陣列。
思想:
這題需要動筆畫一畫,仔細看看arr[i] 和 i之間的關係。
掌握以上規律之後,一趟遍歷即可得到答案。
**:
class solution
return cnt;
}}
資料結構與演算法 陣列
陣列是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。其中有幾個重要的概念 非線性表 連續的記憶體空間 儲存相同型別的資料 如圖所示,這是乙個長度為5的int陣列arr,我們假設起始的記憶體位址為1000,那麼第乙個元素的記憶體位址範圍就是 1000 1003,這是因為乙...
資料結構與演算法 陣列
題型1 如何用遞迴實現陣列求和 方法1 題型2 如何用乙個for迴圈列印乙個二維陣列 方法1 array在二維陣列中的行號和列號分別為 i maxy i maxy 題型3 用遞迴和非遞迴的方法實現二分查詢 題型4 如何在排序陣列中,找出給定數字出現的次數 方法1 二分查詢,分別找出左邊界和右邊界,左...
資料結構與演算法 陣列
陣列是由相同型別的元素 element 的集合所組成的資料結構,分配一塊連續的記憶體來儲存。利用元素的索引 index 可以計算出該元素對應的儲存位址。維基百科 陣列是線性表資料結構,定義陣列時,系統會分配乙份連續的記憶體空間來儲存一組相同的型別的資料,如int num n 陣列定義為一維陣列 二維...