6.8 移除元素

复习第三遍

移除元素
方法一: 暴力 空间复杂度O(n^2),时间复杂度O(1)
class Solution {
    public int removeDuplicates(int[] nums) {
        int length = nums.length;;
        for (int i = 1; i < length; i++) {
            if (nums[i-1] == nums[i]) {
                this.removeElement(nums, i);
                i--;
                length--;
            }
        }
        return length;

    }

    public void removeElement(int[] nums, int index) {
        for (int i = index + 1; i < nums.length; i++) {
            nums[i-1] = nums[i];
        }
        
    }
}

写错的1 this.不是self. 2 返回值为void写成了int

方法二 时间复杂度: O(n), 空间复杂度O(1)
class Solution {
    public int removeDuplicates(int[] nums) {
        int j = 0;
        for (int i = 1; i < nums.length; i++) {
                if (nums[i] != nums[j]) {
                    j++;
                    nums[j] = nums[i];
                }
        }
        return j + 1;
    } 
}
class Solution {
    public int removeDuplicates(int[] nums) {
       int p = 0;
       int q = 1;
       int j = nums.length;
       while (q < j) {
           if (nums[q] != nums[p]) {
               p++;
               nums[p] = nums[q];
           }
           q++;
       }
       return p + 1;
    } 
}

写错,while循环中,将int j = nums.length - 1;显然错了

盛最多水的容器
方法一:暴力法 空间复杂度O(n^2),时间复杂度O(1)
class Solution {
    public int maxArea(int[] height) {
        int res = 0;
        for (int i = 0; i < height.length - 1; i++) {
            for (int j = i + 1; j < height.length; j++) {
                
                res = Math.max(res, (height[i] < height[j]) ? height[i] * (j - i) : height[j] * (j - i));
            }
        }
        return res;

    }
}
方法二 双指针法 时间复杂度O(n),空间复杂度O(1)
class Solution {
    public int maxArea(int[] height) {
        int res = 0;
        int left = 0;
        int right = height.length - 1;
        while (left < right) {
            int minHeight = Math.min(height[left], height[right]);
            res = Math.max(res, minHeight * (right - left));
            if (height[left] == minHeight) {
                left++;
            }else {
                right--;
            }
        }
        return res;
    }
}

发现的问题,当我想用一行表达的时候

class Solution {
    public int maxArea(int[] height) {
        int res = 0;
        int left = 0;
        int right = height.length - 1;
        while (left < right) {
            res = Math.max(res,height[left] < height[right] ? height[left++] * (right - left) : height[right--] * (right - left));
        }
        return res;
    }
}
// 因为height[left++]在之后left++了,所以导致(right - left)的值错了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值