算法刷题7-删除有序数组中的重复项(leetcode26)

2022年4月9日。中级小白


题目描述

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

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

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [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]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
 

提示:

0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按 升序 排列

 看到题,我被这个原地算法整懵了,所以我只能先把原地算法整清楚,

原地算法:

在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。

反正我理解的就是不能再重新创建一个数组,要在原定的数组上进行修改,然后达到题目中的要求。

解题思路:

 要在数组本身中删除重复的元素,并且题中也说到了

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

既然说了不考虑超出新长度的后面的元素,那么意思就是说,只要把整个数组不重复的元素从索引0开始依次排下去就好。由于数组是有序的,那么意思就是相等的元素会挨着,首先索引为0的第一个元素是不用动的,从索引为1的第二个元素开始判断,只要和上一个固定元素(这里说的固定元素就是确定了已经是可以不动,不被修改的元素,比如索引为0的元素,只要留下这一个就可以了)比较,只要和固定元素相同,就可以忽略,只要不同,那么就可以直接把固定元素的下一个位置给这个元素的值,也就是说将这个值赋给上一个固定元素的下一个索引处的位置。所以重要的是定义一个int类型的变量,用来表示固定元素末尾的索引。最后的有效长度就返回这个变量就行了。看代码:

public static int removeDuplicates(int[] nums) {
        int n = 0;
        for (int i = 0; i < nums.length; i++) {
            if (n == 0 || nums[i] != nums[n-1]){
                nums[n] = nums[i];
                n++;
            }
        }
        System.out.println(Arrays.toString(nums));
        return n;
    }

首先定义一个变量n,表示最终的长度也就是固定元素末尾的索引。

然后对数组循环,像上面说的第一个元素就压根不用动,因为是排序的嘛,所以当n==0的时候就直接让0号元素赋给0号元素,相当于没动嘛,然后n++,n变成1.

那么第i+1次循环的时候i. 那么判断索引为i的元素和索引为n的元素是否相等,也就是第i个元素和固定元素末尾一样不一样,如果是一样,那就忽略就好了,固定元素的索引不用修改

假如不一样,那么就直接把把索引为i的元素赋给固定元素索引的元素就好了。这样一直将数组循环完毕之后,整个元素的所有不重复项就依次按顺序排在了数组的最前面。并且n代表着不重复元素的长度。

当当当当,真的感觉每次做题都会有很多进步哦。这次学到了原地算法。学到新知识的感觉真好。厉害咯。

算法刷题7-删除有序数组中的重复项(leetcode26)_第1张图片

 好的,今天学习任务结束。明天继续学习。活到老,学到老。加油!

你可能感兴趣的:(算法刷题,java,算法)