乘风破浪: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)的复杂度下降一个等级,其实就是简单的利用了一些技巧和思维,但是节省而来的大量的运算时间。
原文地址:https://www.cnblogs.com/zyrblog/p/10222147.html
时间: 2024-11-29 12:38:10