【总结】

参考https://www.bilibili.com/video/BV1Pv4y1Z76N 

适用情况:大部分需数组升序

 

【代码】

27 移除元素

不用管移除后半部分是否为正确答案,所以可直接nums[flag]=nums[i]

class Solution {
    public int removeElement(int[] nums, int val) {
        if(nums==null||nums.length==0)
            return 0;
        int flag=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=val){
                nums[flag]=nums[i];
                flag++;
            }
        }
        return flag;
    }
}

更规范的话,是把i点和flag点位置的元素进行交换(参考283)

 

283 移动0

将0移动到最后

class Solution {
    public void moveZeroes(int[] nums) {
        int j = 0;
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] != 0) {
                int temp = nums[j];
                nums[j] = nums[i];
                nums[i] = temp;
                j++;
            }
        }
    }
}

 

26 移除重复元素

数组升序排列,只需与前一个比较即可

class Solution {
    public int removeDuplicates(int[] nums) {
        int flag=1;
        for(int i=1;i<nums.length;i++){
            if(nums[i]!=nums[i-1]){
                //因为升序排列,只用和前面比即可
                nums[flag]=nums[i];
                flag++;
            }
        }
        return flag;
    }
}

 

80 移除重复数组II 

数组升序排列,每个元素最多可以出现两次,用check标注

class Solution {
    public int removeDuplicates(int[] nums) {
        int flag=1;
        int check=-1;
        for(int i=1;i<nums.length;i++){
            if(nums[i]!=nums[i-1]){
                nums[flag]=nums[i];
                flag++;
                check=-1;
            }
            else if(nums[i]==nums[i-1]&&check==-1){
                nums[flag]=nums[i];
                flag++;
                check=1;
            }
        }
        return flag;
    }
}

 

977

求升序数组平方后的数组(也要保持升序)

唯一可能的特例是负数情况!【-1,1,2】时也是直接平方即可,只有左边负数足够小,即【-10,1,2】时

因为升序排列,那么比较左右两边绝对值,插入新数组即可

right和left是对原数组nums

flag是对新数组ans

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] ans=new int[nums.length];
        int left=0;
        int right=nums.length-1;
        
        for(int flag=nums.length-1;flag>=0;flag--){
            if(Math.abs(nums[left])>Math.abs(nums[right])){
                ans[flag]=nums[left]*nums[left];
                left++;
            }
            else{
                ans[flag]=nums[right]*nums[right];
                right--;
            }
        }
        return ans;
    }
}

 

 posted on 2021-08-23 16:52  alau  阅读(33)  评论(0编辑  收藏  举报