首页 > 编程语言 > 详细

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

时间:2020-07-02 10:05:29      阅读:61      评论:0      收藏:0      [点我收藏+]

技术分享图片

  直接挑战 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);
    }

技术分享图片

 

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

原文:https://www.cnblogs.com/niuyourou/p/13222497.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!