LeetCode高频题26. 删除有序数组中的重复项

LeetCode高频题26. 删除有序数组中的重复项

提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
在这里插入图片描述
基础知识:
【1】LeetCode高频题15:三数之和


题目

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

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

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

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

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = […]; // 输入数组
int[] expectedNums = […]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么您的题解将被 通过。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


一、审题

示例:示例 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 已按 升序 排列


二、解题

这种题目的思想,咱们已经见过多次了

啥思想呢?
就是i与i-1不相等的时候,咱们可以收集答案
你看看这个题:
【1】LeetCode高频题15:三数之和
当时的答案怎么收集?
以a开头,那么后续的答案,就不能再以a开头了,当然i=0时,直接要了答案【因为i=0是第一个,就不会重复的】

本题也是一样的,要求不能用外部数组转移,就空间复杂度o(1)
那么显然就是要把不重复的统统移动到左边来
那只要你i和i-1处数字不相同,咱就往前挪,用index来控制结果数组的位置变化

比如index=0,最开始的话
i=0,1,直接搬移放1,index++=1
i=1,1,查i-1也是1,不搬
i=2,2,查i-1=1,不同,搬i到index=1处,然后index++=2
i=3,2,查i-1也是2,不搬
i=4,2,查i-1也是2,不搬
i=5,3,查i-1=2,不同,搬i到index=2处,然后index++=3
i=6,4,查i-1=3,不同,搬i到index=3处,然后index++=4
i=7,4,查i-1也是4,不搬
完事
在这里插入图片描述

手撕代码:

        //复习:
        //那只要你i和i-1处数字不相同,咱就往前挪,用index来控制结果数组的位置变化
        public int removeDuplicatesReview(int[] nums) {
            if (nums == null || nums.length == 0) return 0;

            int index = 0;//控制新结果,后续的不管
            int N = nums.length;
            for (int i = 0; i < N; i++) {
                if (i == 0 || nums[i] != nums[i - 1]) nums[index++] = nums[i];
            }

            //最后index就是结果,咋着都会加1的
            return index;
        }

测试:

    public static void test(){
        int[] arr = {1,1,2,2,3,4,4};
        int[] arr2 = {1,1,2,2,3,4,4};
        Solution solution = new Solution();
        int len = solution.removeDuplicates(arr);
        for (int i = 0; i < len; i++) {
            System.out.print(arr[i] +" ");
        }
        System.out.println();

        len = solution.removeDuplicatesReview(arr2);
        for (int i = 0; i < len; i++) {
            System.out.print(arr2[i] +" ");
        }
    }

    public static void main(String[] args) {
        test();
    }

结果OK

1 2 3 4 
1 2 3 4 

LeetCode测试
在这里插入图片描述在这里插入图片描述
这个题目属于超级超级超级简单级别的了

你也可以这样写
随意,反正实现了就行

public int removeDuplicates(int[] nums) {
            if (nums == null || nums.length == 0) return 0;
            //从0位置开始搜,找不同于当前i的数,填过来,同时每次记录我数组长++
            int index = 0;//数组索引
            int i = 0;
            nums[index++] = nums[i];
            while (i < nums.length - 1){
                int j = i + 1;
                while (j < nums.length && nums[i] == nums[j]) j++;
                //当j那个数恰好不等于i
                if (j < nums.length){//j不可越界
                    nums[index++] = nums[j];
                }
                i = j;//更新位置
            }
            return index;//这就是长度了
        }

总结

提示:重要经验:

1)这种i和i-1位置数字不一样的,才有必要收集答案的思想,咱们见过多次了,熟悉了就知道在这用,不用别人说你也能手撕代码
2)反正算法题就是优先考虑时间复杂度,再考虑空间复杂度
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: leetcode高频100java是指LeetCode网站上的100道经典算法目,使用Java语言进行解答。这些目涵盖了各种算法和数据结构,包括数组、链表、树、图、排序、查找、动态规划等等。这些目是程序员面试和算法学习的重要参考资料,也是提高编程能力和解决实际问的有效途径。 ### 回答2: LeetCode是一个著名的程序员面试库,其高频100是指在面试经常被问到的100道目。这些目涵盖了算法、数据结构、数学等各个领域,是程序员求职和成长过程不可或缺的练习材料。本文将介绍这100的Java解法。 这100覆盖了许多经典算法,如动态规划、贪心算法、双指针等。对于Java程序员来说,最重要的是要掌握这些算法的核心思想及其实现方法。此外,Java核心类库的一些常用类和函数,如String、Math、Arrays等也是解过程常用的工具。 对于高频100,需要掌握的核心算法包括二分查找、数组和链表的操作、栈和队列、哈希表、递归等。此外,还需要掌握字符串操作、动态规划、贪心算法、回溯算法、深度/广度优先搜索等经典算法。 以数组和链表为例,需要掌握的操作包括数组的查找、排序和去重,以及链表的遍历、反转和合并等。使用Java语言来实现这些操作时,可以使用Java核心库的Arrays和Collections类,它们提供了便捷的方法来处理数组和集合。 另外,Java语言还提供了众多数据结构,如栈、队列、双端队列、优先队列、堆等。这些数据结构可以进行复杂的算法操作,如优先队列可以实现贪心算法、堆可以实现堆排序等。Java还提供了Map和Set这两个关键字来实现哈希表的操作,使得开发人员可以轻松地实现哈希表。 最后,Java还提供了众多的工具类和常用函数,例如字符串操作函数、正则表达式、数学函数等。使用这些函数可以为算法提供更加便捷和高效的实现方法。 总之,掌握LeetCode高频100的Java解法需要深入理解算法核心思想,灵活使用Java语言的各种工具和函数。在实际练习,需要注重代码的可读性、复杂度和鲁棒性。 ### 回答3: LeetCode是全球最大的在线练习平台之一,通过解决LeetCode的问,可以帮助人们提高他们的编程能力。在LeetCode上,有许多高频,这些目被认为是最重要的,因为这些目经常在面试出现。Java作为一种流行的编程语言,被大多数程序员所熟悉和使用。因此,LeetCode高频100java是程序员们需要掌握的重要知识点。接下来,我将详细介绍LeetCode高频100Java。 LeetCode高频100java包括许多经典的算法和数据结构问,例如:动态规划、回溯、DFS、BFS、二分查找、排序、链表、栈、队列、树、图等。每个问都有一份完整的Java代码实现,以帮助程序员理解算法思路。不仅如此,Java代码还包括了详细的注释和解释,以帮助程序员更好地掌握算法。 LeetCode高频100java对于Java程序员来说很重要,因为这些目是在日常编码工作和面试经常出现的问。通过解决这些问,程序员们能够提高他们的编码能力和思维能力。此外,这些问也能帮助程序员们更好地了解Java语言的使用和优化,加深对Java语言特性的理解。 总结来说,对于Java程序员来说,掌握LeetCode高频100java非常重要。这将帮助他们提高他们的编程水平,了解更多的算法和数据结构。通过解决这些问,他们将更容易通过面试,获得更好的编程工作。因此,Java程序员们应该花费足够的时间和精力去学习和掌握LeetCode高频100java。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值