领扣-26/27/80/283 数组专题 做好初始定义 双指针 MD
目錄
- 數組專題:做好初始定義
- 移動零 Move Zeroes -283
- 問題
- 答案
- 移除元素 Remove Element -27
- 問題
- 答案
- 刪除排序數組中的重復項 -26
- 問題
- 記錄位置法
- 快慢指針法
- 刪除排序數組中的重復項 II -80
- 問題
- 答案
| MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
領扣-26/27/80/283 數組專題 做好初始定義 雙指針 MD
***
目錄
===
數組專題:做好初始定義
做數組類算法問題的時候,我們常常需要定義一個變量,明確該變量的定義,并且在書寫整個邏輯的時候,要不停的維護住這個變量的意義。也特別需要注意初始值和邊界的問題。
移動零 Move Zeroes -283
數組 雙指針
問題
給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0]說明:
- 必須在原數組上操作,不能拷貝額外的數組。
- 盡量減少操作次數。
答案
class Solution {public void moveZeroes(int[] nums) {int count = 0;//零的個數for (int i = 0; i < nums.length; i++) {if (nums[i] == 0) {count++;} else {nums[i - count] = nums[i]; //非零往前移}}int n = nums.length;while (count > 0) {nums[n - count] = 0; //填充后面的零count--;}} }移除元素 Remove Element -27
數組 雙指針
問題
給定一個數組 nums 和一個值 val,你需要原地移除所有數值等于 val 的元素,返回移除后數組的新長度。
- 不要使用額外的數組空間,你必須在原地修改輸入數組。
- 元素的順序可以改變。
- 你不需要考慮數組中超出新長度后面的元素。
示例 1:
給定 nums = [3,2,2,3], val = 3, 函數應該返回新的長度 2, 并且 nums 中的前兩個元素均為 2。示例 2:
給定 nums = [0,1,2,2,3,0,4,2], val = 2, 函數應該返回新的長度 5, 并且 nums 中的前五個元素為 0, 1, 3, 0, 4。 注意這五個元素可為任意順序。答案
這題廢話連篇,其實和上一題核心步驟完全相同,而比上一題還容易。
class Solution {public int removeElement(int[] nums, int val) {int count = 0;//個數for (int i = 0; i < nums.length; i++) {if (nums[i] == val) {count++;} else {nums[i - count] = nums[i]; //往前移}}return nums.length - count;} }刪除排序數組中的重復項 -26
數組 雙指針
問題
給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。
- 不要使用額外的數組空間,你必須在原地修改輸入數組。
- 你不需要考慮數組中超出新長度后面的元素。
示例 1:
給定數組 nums = [1,1,2], 函數應該返回新的長度 2, 并且原數組 nums 的前兩個元素被修改為 1, 2。示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4], 函數應該返回新的長度 5, 并且原數組 nums 的前五個元素被修改為 0, 1, 2, 3, 4。記錄位置法
沃日,這個問題我修改了很多了版本,都有問題,全是邊界問題搞得怪!
問題分析起來很簡單,就是記錄重復元素的個數 count,然后把后面不重復的元素根據 count 移到前面來。
class Solution {public int removeDuplicates(int[] nums) {int count = 0;//刪除個數個數,1, 2, 2, 3, 3, 4 for (int i = 0; i < nums.length - count; i++) {for (int j = i + count + 1; j < nums.length && nums[j] == nums[i + count]; j++) {count++;}nums[i] = nums[i + count]; //往前移}return nums.length - count;} }快慢指針法
解題思路是,我們使用快慢指針來記錄遍歷的坐標,最開始時兩個指針都指向第一個數字
- 如果兩個指針指的數字相同,則快指針向前走一步
- 如果不同,則兩個指針都向前走一步
這樣當快指針走完整個數組后,慢指針當前的坐標加1就是數組中不同數字的個數。
刪除排序數組中的重復項 II -80
數組 雙指針
問題
給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素最多出現兩次,返回移除后數組的新長度。
- 不要使用額外的數組空間,你必須在原地修改輸入數組。
- 你不需要考慮數組中超出新長度后面的元素。
答案
這道題和上面相比沒有多大的區別,關鍵是邏輯問題,如果腦筋轉不過來彎,那很難正確處理指針位置的。
class Solution {public int removeDuplicates(int[] nums) {if (nums.length <= 2) return nums.length;int fast = 1, slow = 0;boolean isRepeat = false;while (fast < nums.length) {if (nums[fast] == nums[slow] && isRepeat) fast++; //【3】之后再發現重復的數后,直接跳過,直到發現另一個數else {isRepeat = nums[fast] == nums[slow];//【1】判斷是不是重復的數nums[++slow] = nums[fast++]; //【2】第一次發現重復的數后,并沒有跳過這個數,而是按照正常邏輯接收了這個數}}return slow + 1;} }2018-12-16
總結
以上是生活随笔為你收集整理的领扣-26/27/80/283 数组专题 做好初始定义 双指针 MD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【bzoj1369】[Baltic200
- 下一篇: 并归排序(看别人的看不懂,自己写了一个)