2024/5/11,天气转阴,微风。睡眠质量良好,准备做题。
1、题目描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e1e5bda00931465eb84244ca5c2b1d32.png)
2、逻辑思考
我的想法是:使用栈来处理,但是题目要求是原地删除,这里就不是很理解,遂看题解去啦。看了官方题解,双指针即可很好解决此问题,我咋就想不到嘞,真的是天才想法。程序员真是个神奇的群体。下面看代码:
代码演示
public int removeDuplicates(int[] nums) {
int n = nums.length;
if(n == 0){
return 0;
}
int fast = 1 , slow = 1;
while(fast < n){
if(nums[fast] != nums[fast - 1]){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
逻辑思路很清晰,fast指针用于遍历数组中的每个元素,而slow指针则用于指向当前不重复序列的末尾。每当遇到一个不重复的元素时,就将其复制到slow指针的位置,并递增slow指针。这样,当fast指针遍历完整个数组后,slow指针之前(包括slow指针所指向的位置)的元素就是无重复的元素,而slow的值(即索引+1)就是新数组的长度。
时间复杂度:O(n),空间复杂度O(1)。
总结:在这段代码中,使用到的算法思想是双指针法(Two Pointers)或称为快慢指针法(Fast and Slow Pointers)。
双指针法通常用于在遍历数组或链表的同时,维护两个指针来执行某些操作。在这个特定的例子中,fast指针用于遍历整个数组,而slow指针则用于指向当前不重复序列的末尾。
- fast指针用于遍历数组中的每个元素,检查当前元素是否与前一个元素不同。
- slow指针用于指向当前不重复序列的末尾,并在找到不重复元素时,将fast指针指向的元素复制到slow指针的位置,并递增slow指针。
这种方法的关键在于,它只遍历数组一次,并且在遍历的过程中就完成了去除重复元素的操作,从而实现了线性时间复杂度O(n)和空间复杂度O(1)(因为只使用了常数个额外变量)。
好啦,今天的第一道题很简单,解决啦,不要忘记复习前面的知识哟,今天也是约了羽毛球,嘿嘿,过一会就要去啦。买了两瓶1.55L的怡宝,两瓶只用5元,赚啦!GOOD BYE!