双指针法总结

最近在刷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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章