LeetCode陣列題分析與解法(2)

2021-10-25 09:15:26 字數 2984 閱讀 3342

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]。這兩組的最小值分別是13,得到的和是4

這道題目的解法是先對陣列進行排序,然後按照從小到大的順序分組即可。這樣得到的分組滿足題目所要求的條件。

public int arraypairsum(int nums)   return sum;}
可以簡單的證明一下這樣的演算法是正確的。對於排序之後的分組,如果找出來兩個分組,將其中的任意兩個元素交換位置。交換之後所得到的新分組的最小值的和,必然小於之前的分組方式。因為在交換之後,之前數值較小的那個分組的最小值保持不變,仍然為四個元素中的最小值;而之前數值較大的那個分組的最小值變小了,最小值變成了交換過來的較小的值。比如,abcd四個元素,滿足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;}
給定乙個只包含01的陣列,找出來其中包含的連續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.連續子陣列裡面擁有相...