LeetCode080_80. 删除有序数组中的重复项 II
LeetCode080_80. 删除有序数组中的重复项 II
一、描述
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
示例 1:
输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 10的4次方
-(10的4次方) <= nums[i] <= 10的4次方
nums 已按升序排列
二、题解
方法:注意题目不让额外开辟空间,原地删除
/*
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:41.3 MB, 在所有 Java 提交中击败了92.83%的用户
通过测试用例:164 / 164
*/
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length <= 2) {
return nums.length;
}
//定义一个变量,用来记录新下标位置
int index = 2;
for (int i = 2; i < nums.length; i++) {
if (nums[index - 2] != nums[i]) {
nums[index++] = nums[i];
}
}
return index;
}
}
LeetCode 1. 两数之和
LeetCode 2. 两数相加
LeetCode 3. 无重复字符的最长子串
LeetCode 4. 寻找两个正序数组的中位数
LeetCode 5. 最长回文子串
LeetCode 6. Z 字形变换
LeetCode 7. 整数反转
LeetCode 8. 字符串转换整数 (atoi)
LeetCode 9. 回文数
LeetCode 10. 正则表达式匹配
LeetCode 13. 罗马数字转整数
LeetCode 14. 最长公共前缀
LeetCode 20. 有效的括号本
LeetCode 26. 删除有序数组中的重复项
LeetCode 27. 移除元素
LeetCode 28. 找出字符串中第一个匹配项的下标
LeetCode 35. 搜索插入位置
LeetCode 53. 最大子数组和
LeetCode 66. 加一
LeetCode 67. 二进制求和
LeetCode 69. x 的平方根
LeetCode 70. 爬楼梯
LeetCode 80. 删除有序数组中的重复项 II
声明:
题目版权为原作者所有。文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。
By luoyepiaoxue2014
B站: https://space.bilibili.com/1523287361 点击打开链接
微博: http://weibo.com/luoyepiaoxue2014 点击打开链接