leetcode上陣列題的分析與解法的第二部分。這些題目都是通過兩個指標來完成。
翻轉字串是經典的演算法問題了。可以通過兩個指標來完成,分別從字串的首尾開始遍歷。
public void reversestring(char s) for (int i = 0, j = s.length - 1; i < j; i++, j--) }
陣列中包含了2n
個整數。對這些整數進行分組,每組中有2個元素。要求每個分組中最小值的和盡可能大。返回這些最小值的和的最大值。比如,陣列[1, 4, 2, 3]
分成兩組,[1, 2]
和[3, 4]
。這兩組的最小值分別是1
和3
,得到的和是4
。
這道題目的解法是先對陣列進行排序,然後按照從小到大的順序分組即可。這樣得到的分組滿足題目所要求的條件。
public int arraypairsum(int nums) return sum;}
可以簡單的證明一下這樣的演算法是正確的。對於排序之後的分組,如果找出來兩個分組,將其中的任意兩個元素交換位置。交換之後所得到的新分組的最小值的和,必然小於之前的分組方式。因為在交換之後,之前數值較小的那個分組的最小值保持不變,仍然為四個元素中的最小值;而之前數值較大的那個分組的最小值變小了,最小值變成了交換過來的較小的值。比如,a
、b
、c
和d
四個元素,滿足a <= b <= c <= d
。之前的分組方式為(a, b)
和(c, d)
,兩個分組的最小值的和為a + c
。任意交換兩個元素之後,假設得到分組(a, c)
和(b, d)
,最小值的和變為a + b
。顯然a + b <= a + c
。通過反證法就證明了演算法的正確性。
給定乙個陣列nums
和值val
,從陣列中刪除值為val
的元素,並返回刪除後新的陣列長度。要求在原始陣列上直接進行修改。
解法是用快和慢兩個指標。快指標用來遍歷陣列,慢指標用來修改陣列中的值來刪除元素。
public int removeelement(int nums, int val) } return i;}
給定乙個陣列nums
,把其中的0
都移動到陣列末尾,並保持其他非0
元素的相對順序。
這也是乙個典型的雙指標的問題,和刪除元素(#1151)的解法類似,先把非0
的元素移動到陣列前部,然後把剩下的元素設為0
即可。
public void movezeroes(int nums) } if (i < nums.length) }
另外一種解法是不需要後續的把陣列末尾設定為0
的操作,而是在遍歷時直接設定。
public void movezeroes(int nums) }}
從乙個已排序陣列nums
中刪除重複元素並返回新的長度。
使用快和慢兩個指標。慢指標指向當前需要檢查重複的元素,快指標遍歷掃瞄,直到找到第乙個不相同的元素。這個元素被放置在慢指標當前元素的下乙個位置,然後繼續遍歷。
public int removeduplicates(int nums) } return i + 1;}
給定乙個只包含0
和1
的陣列,找出來其中包含的連續1
的最大個數。比如,[1, 1, 0, 1, 1, 1]
中連續1
的最大個數是3
。
解法同樣是使用快和慢兩個指標。快指標遍歷陣列,慢指標指向的是1
之前的最後乙個0
。需要額外處理的情況是陣列的最後乙個元素為1
的情況。
public int findmaxconsecutiveones(int nums) else if (j == nums.length - 1) } return max;}
給定乙個只包含n
個正整數的陣列和正整數s
,找到長度最小的連續子陣列使得其和大於或等於s
。比如,陣列[2, 3, 1, 2, 4, 3]
和值7
,對應的結果為2
,由子陣列[4, 3]
來滿足。
解法是使用兩個指標。慢指標指向當前檢查的子陣列的左邊界,快指標指向右邊界。當子陣列的和大於或等於s
時,得到乙個可能的解。這個時候,需要移動慢指標來縮小子陣列以求得可能的更優的解。
public int minsubarraylen(int s, int nums) } return minlength != integer.max_value ? minlength : 0;}
對於乙個公升序排列的陣列和給定的和,找出陣列中的兩個元素,使得它們的和等於給定值。
解法是使用左和右兩個指標,分別從陣列的兩頭遍歷。因為陣列有序,如果當前的和大於給定值,移動右邊指標;反之則移動左邊指標。
public int twosum(int numbers, int target) int left = 0, right = numbers.length - 1; while (left < right) else if (sum > target) else } return result;}
LeetCode之鍊表題分析與刷題總結
因為鍊錶可以使用指標進行遍歷,這時塊就可以使用指著對鍊錶進行遍歷 可以使用雙指標,快慢指標 鍊錶具有天然的遞迴性 可以把上圖中的第二個鍊錶看成節點 0 後面掛接了乙個更短的鍊錶,比第乙個鍊錶少了乙個節點 這個更短的鍊錶可以看成 1 作為頭節點的鍊錶,這個更短的鍊錶可以繼續看成節點 1 後面掛接了乙個...
刷題(leetcode陣列相關)
1.兩數之和 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路一.遍歷陣列中的每個數,與它後面每個數相加的結果是否等於target var t...
leetcode刷題 陣列 陣列的度
給定乙個非空且只包含非負數的整數陣列 nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。示例 1 輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.連續子陣列裡面擁有相...