第一次提交,两个测试用例都通过了,最后提交结果显示为【超出时间限制】,不通过的测试用例为 nums = [1,1]
于是,改
加了 if 判断语句
但还是提交结果显示【超出时间限制】,不通过的测试用例为 nums = [1,2,2]
卒!!!!!!
class Solution { public int removeDuplicates(int[] nums) { int k = 0; int ans = 1; for (int i = 0; i < nums.length - 1; i = k) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] != nums[i]) { nums[ans] = nums[j]; ans++; k = j; break; } //改:缺少一个逻辑:当输入的数组为nums = [1,1]时,会进入死循环,因为 k 的值不更新,一直为 0 //所以 i 一直为0, j 一直为 1;所以会超出时间限制 //加入以下判断 // if (k == 0) { // } } //if判断语句应该放在第二层循环外面 if (k == 0) { return ans; } } return ans; } }
遂,
看题解
【某位同学的思路】
做了蛮久,题解也看了很久才弄明白。这里记录一下我的通俗的理解。 其实可以看作一个喜新厌旧的人的一个排队列过程。这个人比较喜新厌旧,看到没有见过的数字,就把它按顺序从左到右排好,如果是已经见过的数字就直接忽略掉。 比如0 4 4 7 7 7 9 第一个数字保持不动。 然后往后面看看到第一个4,没见过,是第一次看到4,于是把它排到0的后面。 再往后看,又看到一个数字4,老面孔直接忽略掉。 再往后看看到一个数字7,是新面孔。于是把她拉到最左边,放在紧跟着0 4的位置。 再往后看是7,直接忽略,接着又是7,直接忽略。 直到看到新的数字9,然后把然后把放到0 4 7的后面。 可以理解为左边是所有的新面孔的队列,而快指针就是评审官,负责找到新面孔。
这么理解的话去看很多人的代码和解释,我觉得会更容易理解一些。
【但我看了之后有个疑问:它怎么辨别是不是新面孔】
【看了一个前排的题解之后,疑问得到回答】:先放过程
在这个题解中 用 p 指针及前面的元素都是出现过的,用 q 指针去探寻 q 后面的元素是不是新面孔,因为题目中说了,数组是 非严格递增排序的数组,既有序数组
【我用了三个指针!!!都没完美解决这道题!!! 没事儿~再接再厉嘛~这才刚开始捏,梅花香自苦寒来!】
插入别人的代码:
public int removeDuplicates(int[] nums) { if(nums == null || nums.length == 0) return 0; int p = 0; int q = 1; while(q < nums.length){ if(nums[p] != nums[q]){ nums[p + 1] = nums[q]; p++; } q++; } return p + 1; } 作者:Max 链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
标签:新面孔,26,nums,--,题解,int,数组,ans From: https://www.cnblogs.com/18191xq/p/17822974.html