力扣 題目27-- 移除元素
阿新 • • 發佈:2022-04-15
題目
題解
雙指標
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 forView Code(; 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 } 16else 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 }