labuladong公众号算法学习笔记
有序数组、链表查重
LeetCode第26题
原地修改的意思就是在原有数组上进行操作,不再重新new一个数组出来。
在原数组上操作,然后返回一个长度,这样就可以得到去重后的元素有哪些。
可以采用“快慢指针”的技巧。
int removeDuplicates(int[] nums){
if(nums.length==0) return 0;
int fast=0,slow=0;
while(fast<nums.length){
if(nums[slow]!=nums[fast]){
slow++;
nums[slow]=nums[fast];
}
fast++;
}
return slow+1;
}
链表,LeetCode83
public ListNode deleteDuplicates(ListNode head){
if(head==null) return null;
ListNode slow=head;
ListNode fast=head;
while(fast!=null){
if(fast.val!=slow.val){
slow.next=fast;
slow=slow.next;
}
fast=fast.next;
}
//断开后面连接
slow.next=null;
return head;
}
移除元素
int removeElements(int[] nums,int val){
if(nums.length==0) return 0;
while(fast<nums.length){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
移动零
相当于移除nums数组中所有的0,然后再把后面的元素都赋值为0即可。
void moveZeroes(int[] nums){
//去除nums中的所有0
//返回去除0后的数组长度
int p=removeElemts(nums,0);
//将p后所有元素赋值给0
for(;p<nums.length;p++){
nums[p]=0;
}
}
int removeElements(int[] nums,int val){
if(nums.length==0) return 0;
while(fast<nums.length){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}