ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

力扣面试经典150题-26. 删除有序数组中的重复项

力扣面试经典150题-26. 删除有序数组中的重复项 文章目录题目**快慢指针解法****小小的优化**题目给你一个非严格递增排列的数组 nums 请你原地在nums数组中完成 删除重复出现的元素使每个元素 只出现一次 返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k。去重后返回唯一元素的数量 k。nums 的前 k 个元素应包含 排序后 的唯一数字。下标 k - 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 。不需要考虑数组中超出新长度后面的元素。补全一下代码classSolution{publicintremoveDuplicates(int[]nums){}不知道快慢指针解法的可以看我的另一篇文章--力扣面试经典150题-27. 移除元素解法二快慢指针快慢指针解法[0,0,1,1,1,2,2,3,3,4]slow指针初始值为0slow指针及前面的元素是符合题目要求的包括slow(slow指向最后一个已确认符合要求的元素)fast指针在前面探路当nums[fast] nums[slow]时fast指针所指值只可能大于或等于slow指针所指值因为“slow指针及前面的元素时符合题目要求的”可以根据快慢指针推演出来所以先slow指针右移然后将fast指针所指值赋值给slow指针所指值最后返回slow1因为“slow指针及前面的元素时符合题目要求的”slow是索引值而索引是从0开始的因此个数应该是索引值1classSolution{publicintremoveDuplicates(int[]nums){//如果传进来的数组nums长度为0就返回数量为0if(nums.length0){return0;}intslow0;for(intfast0;fastnums.length;fast){if(nums[fast]nums[slow]){slow;nums[slow]nums[fast];}}returnslow1;}}小小的优化fast指针一定和slow指针一样或更快因此fast指针所指值只可能大于或等于slow指针所指值因此if条件nums[fast] nums[slow]可以换成nums[fast] ! nums[slow]数组第一个元素一定符合要求slow指针和fast指针初始值可以都设为1可以不用比较第一个数是否符合要求此时slow指针前面的元素是符合题目要求的不包括slowslow指向最后一个已确认符合要求的元素的后一个元素此外可以将slow; nums[slow] nums[fast];合并为nums[slow] nums[fast];classSolution{publicintremoveDuplicates(int[]nums){//如果传进来的数组nums长度为0就返回数量为0if(nums.length0){return0;}intslow1;for(intfast1;fastnums.length;fast){if(nums[fast]!nums[slow-1]){nums[slow]nums[fast];}}returnslow;}}
返回列表