嗨,大家好,我是袁小厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。
题目描述
快慢指针
做题思路
快慢指针顾名思义就是一个指针在前面走(快),另一个在后面走(慢),然后当前面的指针和后面的指针的值相同时,那前面的走,后面的不动,当不同时共同往前走。初始状态
此时红指针和绿指针的值一样,需要注意,此时只移动红,而蓝不动
然后将红色的值赋给绿的下一个节点
这里需要注意的是我们 nums[++i]==nums[j++] 这个代码是核心,赋值时应先将i加1,不然会把i的当前值覆盖掉。
跳出循环
题目代码
class Solution {
public int removeDuplicates(int[] nums) {
if(nums.length == 0){
return 0;
}
int i = 0;
int j = 1;
while(j<nums.length){
if(nums[i]!=nums[j]){
//这一行代码很重要
nums[++i]=nums[j++];
}else{
j++;
}
}
//输出的是长度,需要注意
return i+1;
}
}
时间复杂度:O(n),空间复杂度:O(1)
压缩法
做题思路
压缩法就是将数组的长度缩小,每遇到相同的数字就进行压缩数组,然后快指针向前移动,快指针是每遍历一次移动一次,这个方法和快慢指针方法类似。题目代码
class Solution {
public int removeDuplicates(int[] nums) {
int length=nums.length;
int j=1;
//遍历数组
for(int i=0;i<nums.length-1;i++)
{
//如果相同的话就压缩数组
if(nums[i]==nums[i+1])
length--;
else
//不同情况进行移动
nums[j++]=nums[i+1];
}
return length;
}
}
总结
这个题目属于数组的经典题,推荐大家做一做,学会了快慢指针的思想对很多题目都有帮助。
作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。