题目描述:
给你一个 升序排列 的数组 nums,请你 原地 删除重复出现的元素,使每个元素 只出现一次,返回删除后数组的新长度 。元素的 相对顺序 应该保持 一致。判题标准:
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分 。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果 。
将最终结果插入 nums 的前 k 个位置后返回 k。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成 。
系统会用下面的代码来测试你的题解:
int[] nums = [...]; // 输入数组int[] expectedNums = [...]; // 长度正确的期望答案int k = removeDuplicates(nums); // 调用assert k == expectedNums.length;for (int i = 0; i < k; i++) {assert nums[i] == expectedNums[i];} 如果所有断言都通过,那么您的题解将被通过 。示例:
示例 1:提示:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2,并且原数组 nums 的前两个元素被修改为 1, 2。不需要考虑数组中超出新长度后面的元素 。
示例 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。不需要考虑数组中超出新长度后面的元素 。
题解一(双指针):
0 <= nums.length <= 3 * 104-104 <= nums[i] <= 104nums已按 升序 排列
class Solution {public int removeDuplicates(int[] nums) {//设置双指针,第0位数组元素肯定是独特的,所以从1开始int fast = 1;//快指针,寻找不重复的数组元素int slow = 1;//慢指针,指定不重复数组元素的下标位置//当数组元素为空,直接返回0;当数组中只有一个元素,返回1 。if(nums.length == 0)return 0;if(nums.length == 1)return 1;//fast指针向后寻找不重复元素,并存入slow指定的下标位置中for(fast = 1 ;fast < nums.length ; fast++){if(nums[fast] != nums[fast-1]){nums[slow]=nums[fast];slow++;}}//最后得到的slow的值就是不重复元素个数return slow;}} 运行详情:题解二(更简洁):
class Solution {public int removeDuplicates(int[] nums) {int t = 0;for (int i = 0; i < nums.length; i ++ ) {if (i == 0 || nums[i] != nums[i - 1]) nums[t ++ ] = nums[i];}return t;}} 其他:【力扣 26.删除有序数组中的重复项】开始一直在硬算,知道双指针这个方法后才能算是有了一点思路,顺着大佬的思路自己慢慢敲 。
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
