【leetcode c++】27 Remove Element

來源:互聯網
上載者:User

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;*/}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.