leetcode刷题之数组之双指针

27.移除元素

思路简述

这个题有两种方法,第一种是暴力,另一种是双指针法。而且需要注意的是不能使用额外的数组空间。
但这两种方法的本质相同,都是将不等于val的数移到数组左部,或者说,将等于val和不等于val的两部分进行分离。
暴力法的核心算法是每当遇到一个等于val的数nums[i]时,就将下标i之后的所有数都向前移一位,移完后将数组nums的size减1。最后返回size;

public static int removeelement(int[] nums,int val) {
 	 	int size=nums.length;
 	 	for(int i=0;i<size;i++) {
 	 		if(nums[i]==val) {
 	 		  for(int j=i+1;j<size;j++) {
 	 			  nums[j-1]=nums[j];
 	 		  }
 	 		  size--;
 	 		  i--;
 	 		}
 	 	}
 	 	return size;
 	}

双指针法的核心算法在于设立left、right快慢指针,right指针任务是进行遍历,而left指针任务是保存值不是val的数,当right指针遇到不是val的数时,left指针将该数进行存储后右移。
left从左边界0开始,如果nums[right]不等于val,那么nums[left]=nums[right],同时left指针+1。最后返回的left指针,指向左部存储非val值的最后一位。

public int removeElement(int[] nums, int val) {
        int left=0;
        for(int right=0;right<nums.length;right++) {
            if(nums[right]!=val) {
                nums[left]=nums[right];
                left++;
            }   
        }
        return left;
    }

26.删除排序数组中的重复项

思路简述

首先要注意题目给出的是一个有序数组!换言之,重复的元素都是挨着的。
关键思路就是设置left和right指针(快慢指针),right指针负责遍历,left指针则负责判断right指针指向的元素是否和自己指向的元素相同,如果相同,则不动如山。如果不同,则left右移一位,并存储right指向的元素。即nums[left++]=nums[right];
注意,最后要返回left+1;因为是要返回数组的新长度。

public static int removeduplicates(int[] nums) {
 		int left=0;
 		for(int right=0;right<nums.length;right++) {
 			if(nums[right]!=nums[left]) {
 				nums[++left]=nums[right];
 			}
 		}
 		return left+1;
 	}

双指针套路合集
https://zhuanlan.zhihu.com/p/95747836
可看上面这个总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值