赞
踩
题目详情:
给定一个有序数组nums,请 原地 删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不使用额外的数组空间,必须在 原地 修改输入数组,并在使用 O(1) 额外空间的条件下完成。
输入: nums = [1,1,2]
输出: 2,nums = [1,2]
解释: 函数返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 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 。不需要考虑数组中超出新长度后面的元素。
方法一: 双指针(快慢指针)
class Solution {
public int removeDuplicates(int[] nums) {
if(nums == null || nums.length == 0) return 0;//判断数组中是否为空
int slow = 0;//初试化慢指针
int fast = 1;//初试化快指针
while(fast < nums.length){//循环条件:只要快指针地址不超过数组长度,则一直循环
if(nums[slow] != nums[fast]){//判断不等的情况
nums[slow + 1] = nums[fast];
slow++;
}
fast++;//执行相等的情况
}
return slow + 1;//最后返回的是数组的元素个数,而slow是下标,所以返回需要+1
}
}
方法二: 通用解法
题目要求使每个元素只出现一次,通用解法改为每个元素出现k次。
class Solution {
public int removeDuplicates(int[] nums) {
return process(nums, k);
}
int process(int[] nums, int k) {
int u = 0;
for (int x : nums) {
if (u < k || nums[u - k] != x) nums[u++] = x;
}
return u;
}
}
class Solution {
public int removeDuplicates(int[] nums) {
return process(nums, 1);
}
int process(int[] nums, int k) {
int u = 0;
for (int x : nums) {
if (u < k || nums[u - k] != x) nums[u++] = x;
}
return u;
}
}
输入: nums = [1,1,1,2,2,3]
输出: 5, nums = [1,1,2,2,3]
解释: 函数返回新长度 length = 5,并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
输入: 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 。
因为每个元素保留2个相同元素,只要把k设为2即可。
class Solution {
public int removeDuplicates(int[] nums) {
return process(nums, 2);
}
int process(int[] nums, int k) {
int u = 0;
for (int x : nums) {
if (u < k || nums[u - k] != x) nums[u++] = x;
}
return u;
}
}
注释:写的不好之处请您纠正,新手小白,期待您来指教!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。