本文共 1106 字,大约阅读时间需要 3 分钟。
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成
重点就是不能利用新的数组空间赋值,只能利用原来的数组。我们这里做下拓展,一个是只返回数组新长度,另一个是尝试获取新数组,
思路一
for循环嵌套遍历,一个正向循环(从0开始),一个反向循环(从length-1开始),如果正循环的值存在,则从原数组删除
import cn.hutool.core.util.ArrayUtil;// 有序数组,已然排序过的int[] nums = new int[]{ 1, 1, 2, 3, 4, 4, 5};public static int[] getNums(int[] nums) { if (nums == null || nums.length == 0) { return new int[0]; } for (int i = 0; i < nums.length; i++) { for (int j = nums.length - 1; j > i; j--) { if (nums[j] == nums[i]) { nums = ArrayUtil.remove(nums, j); } } } return nums; } //这种情况下,返回了新数组 {1,2,3,4,5}
思路二
双指针,只有当右侧指针不等于左侧时,左侧指针移动,并赋值为右侧指针指向数值。这样左侧指针的长度就是最终答案
public static int removeDuplicateNums(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int left = 0; for (int right = 1; right < nums.length; right++) { if (nums[left] != nums[right]) { nums[++left] = nums[right]; } } return ++left;}
转载地址:http://ddejn.baihongyu.com/