leetcode_middle_73_80. Remove Duplicates from Sorted Array II

题意:

给一个有序数组,对于其中每种数字,如果多于两个,则去除多于两个的部分,并返回新数组的长度。


分析:

从旧数组到新数组,第一想法就是遍历旧数组(一个指针),生成新数组,一个指针。

那么,什么时候新数组的指针移动呢?(即放入新数组)应该是当旧数组的相邻数值不同的时候。

一种数字,只有一个:放这个进入新数组

一种数字,只有两个:放这两个进入新数组

一种数字多于两个,多于的就不放了,但要确认已经放入了两个。

现在的问题是,如何判断是哪种情况:我们先尝试合并转化以上三种情况:当一种数字少于等于两个的时候,就全部放入。

那么放入条件:同一种数字有一个或两个,就放入一个或两个。

换言之:只要不是同一种数字出现第三次,前面的出现多少就放多少。

所以再思考放入条件:当一个数字出现第三次及以上的时候不放入,其它时候放入。


现在,问题转化:什么时候知道数字出现第三次呢?=》当新数组已经有两个的时候。

所以:只要不是第三个相同的就放入。

public class Solution {
       public int removeDuplicates(int[] nums) {
        int j = 0;
        for (int i=0; i<nums.length; i++)
            if (j < 2 || nums[i] != nums[j-2]){
                nums[j] = nums[i];
                j++;
            }
        return j;
    }
}

反思:对于一个问题要紧紧抓住实质,去分析,转化,从多个方面来分析,归并,转化,分解。比如:思考什么是要放入的,可以转而思考什么是不放入的......

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值