leetcode刷题18

时间:2019-08-28
本文章向大家介绍leetcode刷题18,主要包括leetcode刷题18使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

j今天刷的题是LeetCode26题,题目要求是给定一个排序数组,要求删除其中重复的元素

并且不能申请额外的数组空间,必须原地操作,以及空间复杂度为01

首先是来看我自己的代码,我是这样想的,当找到重复的元素的时候,就把数组后面整体的元素都往前移动,因此重点就成了如何找到重复元素的个数,也就是移动的间隔

具体地代码如下:

public static int solution1(int []nums){
        int length=nums.length;
        int count;
        int i=0;
        while (i<length-1){
            count=0;
            int j=i+1;
            while (j<length){
                if (nums[j]==nums[i]){
                    count++;
                }else {
                    break;
                }
                j++;
            }
            move(nums,i,count);
            length=length-count;
            i++;
        }
        return length;
    }
    public static void move(int [] nums,int start,int interval){
        while (start<nums.length-interval){
            nums[start]=nums[start+interval];
            start++;
        }
    }

然后提交了之后,时间复杂度较高,116ms,因此去参考了LeetCode的官方解答思路。发现更为巧妙。

同样地,需要查找相同元素的个数,我的方法是吧数组整体元素都搬迁移动,而LeetCode的思路是只移动不相等的那个元素,那么最后就是前n个元素就好了

同样地,我也试了一把,代码如下:

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length==0) {
            return 0;
        }else {
            int i=0;
            for (int j = 1; j <nums.length ; j++) {
                if (nums[i]!=nums[j]){
                    i++;
                    nums[i]=nums[j];
                }
            }
            return i+1;
        }
    }
}

时间一下子就缩短到2ms,提升可谓巨大

原文地址:https://www.cnblogs.com/cquer-xjtuer-lys/p/11425128.html