算法通关村第三关——数组白银

文章目录

    • 一、删除元素
      • 1.1 原地移除所有值等于val的元素
      • 1.2 删除有序数组中的重复项
    • 二、元素奇偶移动
    • 三、数组轮转


一、删除元素

1.1 原地移除所有值等于val的元素

LeetCode 27.移除元素
解法1:快慢指针

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

解法2:双指针+覆盖

class Solution {
    public int removeElement(int[] nums, int val) {
        int left=0;
        int right=nums.length-1;
        while(left<=right){
            if(nums[left]==val){
                nums[left] = nums[right--];
            }else{
                left++;
            }
        }
        return left;
    }
}

1.2 删除有序数组中的重复项

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

class Solution {
    public int removeDuplicates(int[] nums) {
        int slow = 1;
        for(int fast=0;fast<nums.length;fast++){
            if(nums[slow-1]!=nums[fast]){
                nums[slow]=nums[fast];
                slow++;
            }
        } 
        return slow;
    }
}

二、元素奇偶移动

LeetCode 905.按奇偶排序数组
双指针遍历判断。

class Solution {
    public int[] sortArrayByParity(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while(left<right){
            if(nums[left]%2>nums[right]%2){
                int tmp = nums[left];
                nums[left] = nums[right];
                nums[right] = tmp;
            }
            if(nums[left]%2==0) left++;
            if(nums[right]%2==1) right--;
        }
        return nums;
    }
}

三、数组轮转

LeetCode 189.轮转数组
比如 1,2,3,4,5,6,7。向右轮转3个位置,结果为5,6,7,1,2,3,4

可以把数组分为不轮转的数组和要轮转的数组两部分 1,2,3,4 和 5,6,7。各自反转为4,3,2,1和7,6,5。最后整体反转得到结果。

class Solution {
    public void rotate(int[] nums, int k) {
        int l = nums.length;
        k %= l;
        reverse(nums,0,l-k-1);
        reverse(nums,l-k,l-1);
        reverse(nums,0,l-1);
    }
    private void reverse(int[] nums,int left,int right){
        while(left<right){
            int tmp = nums[left];
            nums[left] = nums[right];
            nums[right] = tmp;
            left++;
            right--;
        }
    }
}

你可能感兴趣的:(算法与数据结构,算法,笔记,java)