[26] Remove Duplicates from Sorted Array

1. 题目描述

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

For example,
Given input array nums = [1,1,2],

Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn’t matter what you leave beyond the new length.

题目意思为给定一个排好序的数组,消除其中重复的元素,并且返回新数组的长度,操作在原数组上进行,且并不在乎超过新数组长度的部分为什么元素。

2. 解题思路

题目的大体与之前做过的消除链表中重复元素相似,不同的是,链表可以通过一个指针的修改直接将一串元素清除,而数组元素是需要进行数组内部的移动操作才能得到新的数组。那么我最爱的方法又来了,画图。
26
验证是否重复无非就是比较当前这个和下一个是否相等,如果相等下一个元素就不要了。所以我们使用两个指针,一个指针保存当前最后一个不重复的节点的位置,另一个指针向后移动,与当前值进行比较,不相等时就将值移动到第一个指针的后面一个元素位置,相等就继续后移不作操作。因为在这个题中,不要求新数组长度外的元素清空,所以做到上图就结束了。

3. Code

public class Solution {
    public int removeDuplicates(int[] nums) {
        // 数组长度为0或1,不会有重复的元素
        if(nums.length <= 1)
        {
            return nums.length;
        }
        // 当前数组中元素数量
        int num = 1;
        for(int i = 0, j = 1; j < nums.length; ++j)
        {
            // 如果相等,i不动j后移
            if(nums[i] == nums[j])
            {
                 continue;
            }
            // 如果不相等,i后移,i位置值等于j位置值
            nums[++i] = nums[j];
            ++num;  // 数组中元素数量加1 
        }
        return num;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值