1. 程式人生 > 其它 >力扣 題目27-- 移除元素

力扣 題目27-- 移除元素

題目


題解


 

雙指標 

int left = 0;
int right = nums.size()-1;

一開始

每次迴圈先從左邊開始

for (; left < nums.size(); left++){}

先在右指標判斷是否為Val 如果是Val 我們肯定就不能把這個值再給左指標了那就往左走

右指標做完了看左指標 應該是相反操作即只有和val一樣的才會停留 然後將右指標的值給左指標 然後右指標向左走 左指標向右走

此時出現 如圖 繼續重複上面賦值操作 

左右指標相等時返回left+1即可(因為left是0開始)

 

這樣確實簡單明瞭 但是有一些特殊情況需要考慮

1. 如下圖所展示 這樣left+1 right-1 就無法到達==的情況以此需要在right-1後加一個額外的判斷

2.如下圖所展示 如果最後的位置是2那麼就應該返回left而不是left+1了

 

程式碼


 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 class Solution {
 5 public:
 6     int removeElement(vector<int>& nums, int val) {
 7         int left = 0;
 8         int right = nums.size()-1;
 9         for
(; left < nums.size(); left++) { 10 while (right>0&&right > left && nums[right] == val) { 11 right = right - 1; 12 } 13 if (left == right&& nums [left] != val) { 14 return left + 1; 15 } 16
else if(left == right && nums[left] == val) 17 { 18 return left; 19 } 20 if (nums[left]==val) { 21 nums[left] = nums[right]; 22 right = right - 1; 23 if (left == right) { 24 return left + 1; 25 } 26 } 27 } 28 return 0; 29 } 30 }; 31 32 int main() { 33 Solution sol; 34 vector<int> nums={ 1,2,1}; 35 int num=sol.removeElement(nums,3); 36 for (int i = 0; i < num; i++) { 37 cout << nums[i] << endl; 38 } 39 40 41 }
View Code