雙指針法總結

最近在刷leetcode的過程中發現很多算法都有如下要求:Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
這對於常規的採用循環甚至雙循環的方法來說空間開銷就很大,而且題設要求不能開闢更多的空間,只能再原來的內存空間進行修改。因此,雙指針法(雙下標法)的用處就體現出來了。
這類算法的思路如下:
初始化兩個指針,一個指向數組的第一個元素(或首位置),另外一個指向數組的最後一個元素(數組末尾的位置),在兩個指針相遇之前,指針1只能向前移動,指針2 只能向後移動。比較當前兩個指針所指元素和與給定數字的大小,如果和較大,指針2向後移動,如果和較小,指針1向前移動。最終的結果是找到兩個滿足條件的數或者不存在這樣的兩個數字。以下結合leetcode的實例總結:

實例:

Leetcode26:Remove Duplicates from Sorted Array

int removeDuplicates(vector<int>&nums){
    if(nums.size()<=0)
    return 0;
    int begin_num = 0;
    for(int i =1;i<nums.size();++i) //這個地方的i<=nums.size()在leetcode提示堆棧溢出,要注意
    {
        if(nums[begin_num]!=nums[i]){
            begin_num++;
            nums[begin_num] = nums[i];
        }
    }
    return begin_num +1; //最後返回的結果要記得加1 因爲沒算最開始的元素,i從1開始計算的。
}

27. Remove Element

//雙指針法
int removeElement(vector<int> & nums, int val){
    if (nums.size()<=0)
        return 0;
    int begin = 0;
    for(int i=0; i <nums.size(); ++i)
    {
        if(nums[i]==val)
            begin++;
        else
            nums[i-begin] = nums[i];
    }
    return nums.size()-begin;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章