26,27删除数组重复项

目录

  • 26,27删除数组重复项

    • 题目
    • 双指针法
      • 题26解法
      • 题27解法一
      • 题27解法二

26,27删除数组重复项

题目

题目26

  • 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
  • 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例:

给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。

题目27

  • 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
  • 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
  • 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例:

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

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

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

刚开始看完题目,不知道应该怎样去解决,为什么不创建新数组就可以“原地”删除元素,在参看力扣优秀解法之后,其实只要返回的新长度的范围内符合即可。

双指针法

题26解法

首先题目是已经排序后的数组,在不考虑数组中超出新长度后面的元素的前提下,可以分别定义快慢指针(i是慢指针,j是快指针),如果重复(nums[i]==nums[j]的情况),直接跳过,将重复的一一向前覆盖(nums[++i] = nums[j];),最终返回新长度即可。

/**
 * 删除数组中重复的项,并返回数组的长度
 * @param nums 传入已排序的数组
 * @return 返回无重复项数组的长度
 */
public int removeDuplicates(int[] nums) {
    if (nums.length == 0) return 0;
    //定义慢指针
    int i = 0;
    //定义快指针
    for (int j = 1; j < nums.length; j++) {
        //相等情况直接跳过
        //不相等时,将nums[j]的值赋值给nums[i+1],然后递增i
        if (nums[j] != nums[i]) {

            nums[++i] = nums[j];
        }
    }
    //返回无重复项数组的新长度
    return i + 1;
}

题27解法一

类似地,也可以运用双指针法求解。还是定义快慢两个指针,只要快指针索引值和目标值不相等,即nums[j]!=val,就可以将该索引值赋值给前面的慢指针索引值,即nums[i]=nums[j],两个指针同时递增,直到快指针截至,最终的新长度就是慢指针i的值。

 /**
 * 删除所有重复的val值,并返回数组的长度
 * @param nums 传入的数组
 * @param val  删除数组中的所有val
 * @return 返回无重复数组的长度
 */
public int removeDuplicates(int[] nums, int val) {

    int i = 0;
    for (int j = 0; j < nums.length; j++) {
        if (nums[j] != val) {
            nums[i++] = nums[j];
        }
    }
    return i;
}

复杂度分析

  • 时间复杂度:O(n) 假设数组总共有n个元素,i和j分别最多遍历n步
  • 空间复杂度:O(1)

题27解法二

题27的解法一很暴力,但是在遇到特殊情况时其实进行了多余的步骤:假如数组包含需要删除的数很少的时候,nums=[4,1,2,3,5],val=4时,题目中特意提示可以不用考虑新数组的元素顺序,可以在遇到nums[i]==val时,将当前元素和最后一个元素交换,并释放数组的最后一个元素。

如果被交换的最后一个元素正好也是想要删除的值,他会在下一次迭代时被发现。

public int removeDuplicates00(int[] nums, int val) {
    int i = 0;
    //定义变量len操作数组长度,因为本身是final的
    int len = nums.length;
    while (i < len) {

        if (nums[i] == val) {
            //相等的情况,将第一个与最后一个交换,
            // 因为数组顺序可以更改,[4,1,2,3,5],val=4,
            //可以避免不必要的移位
            nums[i] = nums[len - 1];
            len--;
        } else {
            i++;
        }
    }
    return len;
}

复杂度分析

  • 时间复杂度:O(n),i和n最多遍历n步,且赋值操作的次数等于将要删除元素的数量,如果要移除的元素很少,效率会很高。
  • 空间复杂度:O(1)

原文地址:https://www.cnblogs.com/summerday152/p/12117224.html

时间: 2024-10-18 17:49:26

26,27删除数组重复项的相关文章

算法-利用object的key唯一性删除数组重复项

# 利用object的key唯一性删除数组重复项 # uniq.html <!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title>   <script type="text/javascript">        var arr=[12,34,2

删除数组重复项

1 class Solution { 2 public int removeDuplicates(int[] nums) { 3 int length = nums.length - 1; 4 for (int i = 0; i <= length; i++) { 5 for (int j = i + 1; j <= length; j++) { 6 if (nums[i] == nums[j]) { 7 for (int k = i; k <length ; k++) { 8 nums

javascript 笔试题之删除数组重复元素

笔试时紧张没写出来,静下心后发现简单的要死. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content=&quo

js去除数组重复项

原文:js去除数组重复项 第一次写,感觉不知道写啥,想了半天决定还是用以前用过的一些东西,看了看就写数组去除重复项算了^_^. 去除数组重复项有很多方法,之前因为用到,看了一下以前搜集的一些代码,进行比较,在这里总结一下,希望能给各位有所帮助,有什么问题,请各位大神不吝指导. 方法一: //两个for循环 Array.prototype.delRepeat1 = function () { var r = new Array(); label: for (var i = 0, n = this.

返回数组中的最大值和删除数组重复值-排序

//数组中最大值function getMax(arr){ //取该数组第一个值为最大值 var max=arr[0]; for(var i=0;i<arr.length;i++){ if(arr[i]>max){ max=arr[i] } } return max;} console.log(getMax([2,98,10,88])) /*--------------------------------------------------------------------*///删除数组重

js tool 方法之删除数组指定项

最近又开始写博文了,还是在自己的本地项目上做一些小的方法案例. 之前撸代码的时候总是遇到删除数组里某个元素的问题,JS没提供便捷的方法,只能自己写个循环处理,所幸自己写个方法,以后博客项目里要用到就不用重复去写代码了. 方法名:RemoveArrItemByVal 移除数组中的指定项,根据某个值 考虑到参数输入的问题,对此做了一个小小的逻辑校验,如果没有传递参数会返回一个新的空数组. 可能会有人问为什么不返回传入的arr数组呢? 因为考虑到如果传入的arr不是个数组,那这个方法返回的也就不是一个

Perl快捷删除数组重复元素,以前写过类似的博客,今天被问起时,却支支吾吾!

以前写过类似的博客: http://blog.csdn.net/three_man/article/details/34084361 今天拿出来,再好好剖析一下: 1. 构造一个含有重复元素的数组 my @arr1 = (1 .. 10); my @arr2 = (5 .. 15); # join multi array my @arr = (@arr1, @arr2); 2. 删除数组中的重复元素 sub removeRepeat { my $arrRef = shift; my %count

Sql操作 - 删除数据库重复项

TableName : yourtablename Existed Fields: yourfield1,yourfield2, handle....... 删除指定字段yourfield1为MatchedString所所有重复项 delete * from yourtablename where yourfield1='MatchedString' and handle not in (select distinct min(Handle) from chnl where yourfield1

javscript巧用对象特性去掉数组重复项并排序

当有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},然后运行alert(a[0]),两种情况下的运行结果都是1,这就是说,数据集合既可以用数组表示,也可以用对象表示!但是我们是无法定义一个具有两个相同key值的object,而我们正可以利用这种特性来去掉数组中的重复项. 把数组转成一个js对象 把数组中的值变成对象中的key 把对象还原成数组 //把数组转成一个js对象 function toObj(arr){ var obj = {}; for(var i=