zoukankan      html  css  js  c++  java
  • 【LeetCode】删除排序数组中的重复项&&移除特定元素【双指针,原地算法】

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

    示例 1:

    给定数组 nums = [1,1,2],

    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

    你不需要考虑数组中超出新长度后面的元素。

    示例 2:

    给定 nums = [0,0,1,1,1,2,2,3,3,4],

    函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

    你不需要考虑数组中超出新长度后面的元素。

    来源:力扣(LeetCode)
    链接:
    https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

    分析:空间复杂度必须为O(1)

    数组有序,这是可以使用双指针的前提

    两个指针p1和p2,一开始都指向原数组的开头

    我们假设p1指向去除重复数字后的数组的最后一个元素

    假设p2指向当前需要去除重复的数字

    如果当前p1==p2,那么p1++

    如果当前p1!=p2,则p1++,将p2指向的值放入当前p1的位置

    核心思想:

    两个指针都是右移,只有当两个指针指向的元素不同的时候,才把该不同的元素放入p1,然后p1++

    这样利用了原有的数字空间,属于原地算法

    时间复杂度:O(N)

    空间复杂度:O(1)

    class Solution {
    public:
    int removeDuplicates(vector<int>& v)
    {
        int n=v.size();
        if(n==0)
            return 0;
        int k=0;
        for(int i=1;i<n;i++)
        {
            if(v[i]!=v[k])
            {
                k++;
                v[k]=v[i];
            }
        }
        return k+1;
    }
    };


    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

    元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

    示例 1:

    给定 nums = [3,2,2,3], val = 3,

    函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

    你不需要考虑数组中超出新长度后面的元素。

    示例 2:

    给定 nums = [0,1,2,2,3,0,4,2], val = 2,

    函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

    注意这五个元素可为任意顺序。

    你不需要考虑数组中超出新长度后面的元素。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/remove-element

    分析:和第一题思路一模一样,只是移动的条件由两个元素是否相等边除了元素是否等于特定元素

    时间复杂度:O(N)

    空间复杂度:O(1)

    class Solution {
    public:
    int removeElement(vector<int>& v, int x)
    {
        int n=v.size();
        if(n==0)
            return 0;
        int i=0;
        for(int j=0;j<n;j++)
        {
            if(v[j]!=x)
            {
                v[i++]=v[j];
            }
        }
        return i;
    }
    };


  • 相关阅读:
    RF手持配置问题
    S4系统编辑屏幕报错
    【SAP】日志表CDHDR和CDPOS
    VA01隐藏销售凭证流的金额
    ABAP MODIFY SCREEN
    解决SMARTFORMS 中table 控件单行跨页的问题
    golang json 性能分析
    【高性能】GO 高性能专题
    9千万次循环 从2分3秒 优化到 7.3秒的过程 GO语言
    IDE 插件开发 相关点 -------------- Vscode debug protocol JDWP DAP
  • 原文地址:https://www.cnblogs.com/yinbiao/p/11347937.html
Copyright © 2011-2022 走看看