思路 - O(n^2)

和删除数组中某一项的思路相似。

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. int i = 0;
  4. int count = 0;
  5. while (i + count < nums.length - 1) {
  6. if (nums[i] == nums[i + 1]) {
  7. removeOne(nums, i + 1);
  8. count++;
  9. } else {
  10. i++;
  11. }
  12. }
  13. return nums.length - count;
  14. }
  15. public void removeOne(int[] nums, int i) {
  16. for (int k = i; k < nums.length - 1; k++) {
  17. nums[k] = nums[k + 1];
  18. }
  19. }
  20. }

思路 - O(n)

双指针
i 表示待填充的位置
j 表示可以填充到i的值
j 走完 nums.length 代表没有可以填充的值,返回。

代码

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. int i = 0;
  4. int j = 1;
  5. while (j < nums.length) {
  6. if (nums[i] != nums[j]) {
  7. i++;
  8. nums[i] = nums[j];
  9. }
  10. j++;
  11. }
  12. return i + 1;
  13. }
  14. }