LeetCode80 26,有序数组中,每个数只能重复出现K次。思路与Java解答

LeetCode80

LeetCode26

给一个有序整数数组,数组中的每个元素,最多只能重复出现K次。80题中,K=2;26题中,K=1。

先贴代码:

public class Solution80 {

	private static final int K = 2;

	/**
	 * @param nums it's sorted!
	 */
	public int removeDuplicates(int[] nums) {
		if (nums.length < K + 1) { // 入参判断
			return nums.length;
		}
		int pos = K;
		for (int i = K; i < nums.length; i++) {
			if (nums[i] != nums[pos - K]) { // 判断当前的这三个数是否满足要求
				nums[pos++] = nums[i];
			}
		}
		return pos;
	}

	public static void main(String[] args) {

		int[] nums = new int[] { 1, 1, 1, 2, 2, 3 };
//		int[] nums = new int[] { 0, 0, 1, 1, 1, 1, 2, 3, 3 };

		System.out.println(Arrays.toString(nums));
		System.out.println(new Solution80().removeDuplicates(nums));
		System.out.println(Arrays.toString(nums));
	}
}

关键思路:

假设K=2,则数组中,要求一个元素最多重复出现两次。

1. 任意给定两个数,不论是否重复,肯定都满足要求。

2. 现在任意给三个数1,1,1,要保证这三个数满足要求,由于数组本身是有序的,只用将第三个数和第一个数比较,若相同,则这三个数肯定都相同,不满足题目要求;若不同,则这三个数中,每个数最多重复出现两次,满足要求。

3. 通过for循环,依次判断彼此相邻的三个数是否满足要求(思路2.),若满足,则下标i++,判断下一个三个数是否满足要求;若不满足,由思路1.,剔除掉第三个数,比较 由前两个数和现在这个数 组成的三个数,是否满足要求。

可能有点绕口Orz。直接来模拟一下,或者debug一下程序:

现在任意给N个数n0,n1...,nN-1,假设为1,1,1,2,2,3,按照上面的思路,

从下标2开始,用pos保存正在比较的三个数中第一个数的位置(pos-2)。

for循环:

    判断n0,n1,n2是否满足要求:不满足,将n2剔除

    判断n0,n1,n3是否满足要求:满足

    判断n1,n3,n4(n2已被剔除)是否满足要求:满足

    判断n3,n4,n5是否满足要求:满足

最后得到有1,1,2,2,3组成的长度为5的数组。

有了思路,再在纸上模拟一下,代码就很好写出来了。

第80题的K值为2,26题K值为1。再遇到相同的问题,改一下K值就可以了。

 

以上是我对这两道题目的理解,可能解释的不是很清楚,结合代码debug一下的话应该就没问题了。

欢迎讨论。嘿嘿。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值