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 @   牛有肉  阅读(179)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示