Leetcode 88、189,合并两个有序数组与旋转数组

  直接挑战 O(1) 空间复杂度解法,双指针尾插法:

    /**
    * @Author Niuxy
    * @Date 2020/7/2 9:16 下午
    * @Description 双指针尾插法
    */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int point1 = m - 1;
        int point2 = n - 1;
        int point = m + n - 1;
        while ((point1 >= 0) && (point2 >= 0)) {
            nums1[point--] = (nums1[point1] < nums2[point2]) ? nums2[point2--] : nums1[point1--];
        }
        System.arraycopy(nums2, 0, nums1, 0, point2 + 1);
    }

  下一题:

  朴素解法:

    /**
    * @Author Niuxy
    * @Date 2020/7/2 12:15 上午
    * @Description 朴素解法
    */
    public final void rotate(int[] nums, int k) {
        if (k > nums.length) {
            k %= nums.length;
        }
        for (int i = 0; i < k; i++) {
            rotateOne(nums);
        }
    }

    public final void rotateOne(int[] nums) {
        int last = nums[nums.length - 1];
        for (int i = nums.length - 1; i > 0; i--) {
            nums[i] = nums[i - 1];
        }
        nums[0] = last;
    }

  环形数组解法:

    /**
    * @Author Niuxy
    * @Date 2020/7/2 12:15 上午
    * @Description 环形数组解法
    */
    public final void rotate2(int[] nums, int k) {
        if (nums.length == 0) {
            return;
        }
        if (k > nums.length) {
            k %= nums.length;
        }
        int[] temp = new int[k];
        System.arraycopy(nums, nums.length - k, temp, 0, k);
        System.arraycopy(nums, 0, nums, k, nums.length - k);
        System.arraycopy(temp,0,nums,0,k);
    }

 

posted @ 2020-07-02 00:24  牛有肉  阅读(178)  评论(0编辑  收藏  举报