Remove Element
Given an array and a value, remove allinstances of that value in place and return the new length.
The order of elements can be changed. Itdoesn't matter what you leave beyond the new length.
在數組中刪除給定的元素。這裡沒有具體說明,那麼,這個元素可能是零散分布的。
本著一次掃描的思路,還是得變掃描變交換。不用erase是因為效率的問題,之前的部落格有說過了。題目也隱晦的提示,用賦值或者交換就好。
藉著前面的題的思想,我們對這道題也來一個邊掃描數組邊交換的思路。
我們把被刪除的元素叫做垃圾元素好了。
首先,先定位垃圾元素。用兩個指標來定位,離數組首最近的垃圾元素-指標1和最近的保留元素-指標2。
接下來交換他們。
這時候,指標1指向的是保留元素了,而指標2指向了垃圾元素。
我們的本意是用指標1指向離數組首最近的垃圾元素,指標2離數組首最近的保留元素。 那麼我們就繼續找,讓指標1指向離數組首最近的垃圾元素,指標2離數組首最近的保留元素。
很快就找到了,就這麼找下去。
到了某一步,突然垃圾元素變多了。
沒關係,指標2多往前走幾步。
當到達收尾階段,就是指標2不能在找到保留元素了,我們就判斷指標2到尾時結束處理。
題目要求返回新數組的長度,其實就是指標1所走的距離了。
這樣,就能用交換的方式解決本題了。
Leetcode的AcceptedSolutions Runtime Distribution(15-06-07)
源碼://裡面有一段備忘釋掉的代碼,上面說的思路是,開始先定位兩個指標,之後兩個指標掃描,那麼代碼上就分成兩個部分。注釋掉的代碼的思路是每次迴圈都讓指標2重新再定位,這樣把兩部分代碼合并了,但是指標2多做了掃描。
int removeElement(vector<int>& nums, int val) {//////////////////////////////////////leetcode27////////////////////////////////////////////////////////////////////////int len = nums.size();if (0 == len) return 0;if (1 == len){if (val == nums[0]) return 0;else return 1;//return val == nums[0] ? 0 : 1 ;}/////////////////////////////////////////len = 0;//定位,就是定位到圖示的第一幅圖vector<int>::iterator iter1 = nums.begin();vector<int>::iterator iter2;while (val != *iter1 && nums.end() != iter1){iter1++;len++;}if (nums.end() == iter1) return len;iter2 = iter1;while (val == *iter2 && nums.end() != iter2){iter2++;}//定位結束while (nums.end() != iter2){while (val != *iter1)//找最近的垃圾元素{iter1++;len++;}while (val == *iter2)//找最近的保留元素{iter2++;if (iter2 == nums.end()) return len;}swap(*iter1, *iter2);//交換//showVector(nums);iter1++;len++;iter2++;}return len;/*int len = nums.size();if (0 == len) return 0;if (1 == len){if (val == nums[0]) return 0;else return 1;//return val == nums[0] ? 0 : 1 ;}len = 0;vector<int>::iterator iter1 = nums.begin();vector<int>::iterator iter2;while (nums.end() != iter2){while (val != *iter1 && nums.end() != iter1){iter1++;len++;}if (nums.end() == iter1) return len;iter2 = iter1;while (val == *iter2){iter2++;if (iter2 == nums.end()) return len;}swap(*iter1, *iter2);//showVector(nums);iter1++;len++;iter2++;}return len;*/}