• 乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array


    乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array

    一、前言

        我们这次的实验是去除重复的有序数组元素,有大体两种算法。

    二、Remove Duplicates from Sorted Array

    2.1 问题

         题目大意理解,就是对数组进行元素去重,然后返回去处重复之后的长度,无论我们对数组做了什么的修改,都没有关系的,只要保证再返回的长度之内的数组正确性即可。因为最后是根据长度来遍历的,因此我们不用担心。

    2.2 分析与解决

         题目说的很清晰了,因此,我们首先想到了笨办法,那就是从左往右遍历,如果发现相等的元素,就将后面的元素集体前移,这样最差的时间复杂度是O(n~2)。因此我们想想有没有简单的方法,于是我们想到了只用找一个指针在前面开路,遇到不同的元素了,将这个元素填到相应的位置,然后继续搜索,直至遍历完所有的元素即可,这样一次遍历就能解决问题,时间复杂度O(n~2),只不过也留下了脏空间,不过题目说了不用我们管了,于是问题解决。

         第一种是笨办法:

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

       第二种是一次遍历:

    public class Solution {
        /**
         *
         * 题目大意
         * 给定一个排序的数组,将数组中的重复元素去掉,相同的只保留一个作为新数组的元素,
         * 并且返回数组新的元素个数,
         * 不要创建一个新的数组来保存结果。在常量时间内解决这个问题
         *
         * 解题思路
         * 从第二个元素开始处理,记为当前处理的元素,如果当前元素与他的前一个元素相同就删除这个元素,
         * 如果不同就将它移动到正确的位置,返回最后数组元素个数。
         */
        public int removeDuplicates(int[] A) {
    
            if (A.length == 0) {
                return 0;
            }
    
            int index = 0;//[0,index]只记录数组中出现的按从小到大的唯一一个数,已经排好序了
            int next = 1;
    
            // 算法思想:找index之后的比A[index]大的数,如是找到就移动到A[index+1]处,
            // index移动到下一个位置,next移动到下一个位置,再找比A[index]大的数
    
            while (next < A.length) {
                while (next < A.length && A[index] == A[next]) { // 找不等于数组中最
                    next++;
                }
    
                if (next < A.length) {
                    index++;
                    A[index] = A[next];
                    next++;
                }
            }
            return index + 1;
        }
    }
    

     

    三、总结

        将O(n~2)的复杂度下降一个等级,其实就是简单的利用了一些技巧和思维,但是节省而来的大量的运算时间。

  • 相关阅读:
    实现Java中的ArrayList
    官方下拉刷新控件SwipeRefreshLayout的使用
    SpannableString的基本用法
    AlarmManager的使用
    在Android上使用Socket
    HttpURLConnection、HttpClient和Session
    Cocos2d入门及第一次运行时遇到的问题
    Thread的start和run的区别
    《重构》心得
    startActivityForResult()的用法(超好用啊)
  • 原文地址:https://www.cnblogs.com/zyrblog/p/10222147.html
Copyright © 2020-2023  润新知