1. 程式人生 > >LeetCode Remove Duplicates from Sorted Array

LeetCode Remove Duplicates from Sorted Array

Problem

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.

題目其實包含兩部分要求。首先,需要返回一個已排序陣列,值不相同的元素的個數。例如:[1,1,2]返回2。這也是題目程式碼可以自動校驗的部分。另一個隱含的要求是,要求不使用新的空間,並且在算出個數n後,將值不相同的元素,依次放置到陣列的前N位。

Java 實現


package com.coderli.leetcode.algorithms.easy;

/**
 * Given a sorted array, remove the duplicates in place such that each element appear only once and
 * return the new length.
 * <p>
 * Do not allocate extra space for another array, you must do this in place with constant memory.
 * <p>
 * For example,
 * Given input array nums = [1,1,2],
 * <p>
 * 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.
 *
 * @author li.hzh 2017-10-22 21:24
 */
public class RemoveDuplicatesFromSortedArray { public static void main(String[] args) { RemoveDuplicatesFromSortedArray rdfSortedArray = new RemoveDuplicatesFromSortedArray(); System.out.println(rdfSortedArray.removeDuplicates(new int[]{1})); System.out.println(rdfSortedArray
.removeDuplicates(new int[]{1, 1})); System.out.println(rdfSortedArray.removeDuplicates(new int[]{1, 1, 2})); System.out.println(rdfSortedArray.removeDuplicates(new int[]{1, 1, 2, 2})); System.out.println(rdfSortedArray.removeDuplicates(new int[]{1, 1, 1, 2, 2})); System.out.println(rdfSortedArray.removeDuplicates(new int[]{1, 1, 2, 2, 3, 3})); System.out.println(rdfSortedArray.removeDuplicates(new int[]{1, 2, 2, 3, 4, 4})); } public int removeDuplicates(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int compareValue = nums[0]; int result = 1; for (int i = 1; i < nums.length; i++) { if (compareValue < nums[i]){ compareValue = nums[i]; nums[result] = compareValue; result++; } } return result; } }

分析

解法很簡單,一次遍歷。用變數compareValue記錄當前比較的值,result為不相同的元素個數。當需要比較的值與當前元素值不相同時,即有新值出現的時候,結果+1,將新值放置到當前不相同元素個數所在的索引位即可。(因為題目不要求,除了不相同的元素之外的元素分配。)