目錄
題目:
題目描述:
題目鏈接:
思路:
核心思路:
思路詳解:
樣例模擬:
代碼:
C++代碼:
Java代碼:
題目:
題目描述:
題目鏈接:
27. 移除元素 - 力扣(LeetCode)
思路:
核心思路:
雙指針
思路詳解:
我們先按最容易理解的思路:定義兩個指針i,j,i指針指向第一個元素,j指針指向最后一個元素。我們要遍歷數組中所有的元素進行換位調整,所以編譯完全部元素的條件是兩個指針交錯(即i>j)。在while語句中,判斷i指向的元素是否等于val,如果不等于那么不用調整直接跳過,即i指針后移。如果i指向的元素等于val,那么我們將i指向的元素和j指向的元素對調。此時換到i上的元素是否等于val我們不知道,所以要到下一輪再判斷,但是此時換到j上的元素一定等于val,所以j指針前移。
到最后的i索引一定是最后一個不等于val元素的后一位,所以最后一個不等于val元素的索引為i-1,即一共有i個不等于val的元素。由題要返回不等于val元素的個數,所以返回i。
上述是最容易理解且詳細的思路,由題我們其實只需要保證最后nums的前k個元素是不等于val的元素,nums其余元素和nums大小不重要。所以我們不需要i與j指向元素互換,只需要把j指向元素換到i就行了
樣例模擬:
代碼:
C++代碼:
class Solution {
public:int removeElement(vector<int>& nums, int val) {int i = 0; //i指針指向第一個元素int j = nums.size() - 1; //j指針指向最后一個元素//int temp;while(i <= j) //當兩個指針交錯時表示全部元素已經遍歷完了{if(nums[i] != val){i++; //如果i指向的元素不等于val直接跳過,i指針后移}else{//temp = nums[i];nums[i] = nums[j]; //如果i指向的元素等于val,與j指向的元素進行交換//nums[j] = temp;j--; //那么此時j指向的一定是換過來等于val的值,j指針前移}}return i; //由題返回不等于val的元素數量}
};
Java代碼:
class Solution {public int removeElement(int[] nums, int val) {int i = 0;int j = nums.length -1;//int temp;while(i <= j){if(nums[i] != val){i++;}else{//temp = nums[i];nums[i] = nums[j];//nums[j] = temp;j--;}}return i;}
}