26.删除排序数组中的重复项

自己的写法,不想评价

用到了双指针冒泡的思想,时间复杂度有点慢O(n^2),空间复杂度很行。

  class Solution {
      public int removeDuplicates (int[] nums) {
          for (int i=0; i<nums.length-1; i++) {
              if (nums[i+1] <= nums[i]) {
                  int j = i + 1;
                  int k = i + 2;
                  try {
                      while (nums[k] <= nums[i]) {
                          k++;
                      }
                      int tmp = nums[j];
                      nums[j] = nums[k];
                      nums[k] = tmp;
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          }
          for (int i=0; i<nums.length-1; i++) {
              if (nums[i+1] <= nums[i]) {
                  return i+1;
              }
          }
          return nums.length;
      }
  }

官方的写法

主要用到了双指针的思想

数组完成排序后,我们可以放置两个指针ij,其中i是慢指针,而j是快指针。只要 nums[i] = nums[j],我们就增加j以跳过重复项。
当我们遇到 nums[j]≠nums[i]时,跳过重复项的运行已经结束,因此我们必须把它(nums[j])的值复制到nums[i+1]。然后递增 i,接着我们将再次重复相同的过程,直到j到达数组的末尾为止。

class Solution {
    public int removeDuplicates(int[] nums) {
        int i = 0;
        if (nums == null || nums.length == 0) {
            return 0;
        }
        for (int j=0; j<nums.length; j++) {
            if (nums[j] != nums[i]) {
                i++;
                nums[i] = nums[j];
            }
        }
        return i+1;
    }
}
posted @ 2020-11-07 19:27  Vingkin  阅读(68)  评论(0)    收藏  举报