每日一题:Leetcode-912 排序数组(手撕归并排序)

力扣题目

解题思路

java代码

力扣题目:

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

解题思路:

算法原理
这是一个基于归并排序的算法。归并排序的基本思想是将数组不断地分成两半,对两半分别进行排序,然后将排好序的两半合并起来。

思路

  • sortArray 方法用于启动整个排序过程,创建辅助数组 temp 并调用 mergeSort 。
  • mergeSort 方法是递归函数,将数组不断地分割成两半,直到子数组长度为 1 。然后调用 merge 方法合并。
  • merge 方法用于合并两个已排序的子数组。通过比较两个子数组的元素,将较小的元素依次放入辅助数组 temp 中。然后将 temp 中的元素复制回原数组。

代码分析

  • 在 mergeSort 中,通过中间索引 mid 将数组分成两部分,分别递归排序,然后合并。
  • 在 merge 中,使用两个指针 i 和 j 分别遍历两个子数组,将元素按顺序放入 temp 。再通过两个循环处理剩余的未放入 temp 的元素。最后将 temp 中的元素复制回原数组。

时间复杂度:O(nlogn),其中  是数组的长度。

空间复杂度:O(n),主要是辅助数组 temp 的空间开销。

java代码:

package org.example;

public class Leetcode912 {
    public static void main(String[] args) {
        int[] nums = {5,2,3,1};
        sortArray(nums);
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + " ");
        }
    }
    // 归并
    public static int[] sortArray(int[] nums) {
        int[] temp = new int[nums.length];
        mergeSort(nums, 0, nums.length - 1, temp);
        return nums;
    }
    public static void mergeSort(int[] nums, int left, int right, int[] temp) {
        if (left < right) {
            int mid = (left + right) / 2;
            mergeSort(nums, left, mid, temp);
            mergeSort(nums, mid + 1, right, temp);
            merge(nums, left, mid, right, temp);
        }
    }
    public static void merge(int[] nums, int left, int mid, int right, int[] temp) {
        int i = left;
        int j = mid + 1;
        int k = left;
        while (i <= mid && j <= right) {
            if (nums[i] <= nums[j]) {
                temp[k++] = nums[i++];
            } else {
                temp[k++] = nums[j++];
            }
        }

        while (i <= mid) {
            temp[k++] = nums[i++];
        }
        while (j <= right) {
            temp[k++] = nums[j++];
        }
        for (int l = left; l <= right; l++) {
            nums[l] = temp[l];
        }
    }
}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Java中使用LeetCode是一种常见的方式来练习和提高算法和数据结构的能力。LeetCode提供了大量的算法题目,每个题目都有一个特定的要求和限制条件。在解题过程中,我们需要按照题目要求设计和实现解决方案。 对于Java的LeetCode编程,一般我们会按照以下步骤进行: 1. 阅读题目:仔细阅读题目的要求和限制条件,理解题目的意思。 2. 分析问题:根据题目的要求和限制条件,考虑可用的算法和数据结构来解决问题。可以使用图、树、链表、数组、哈希表等数据结构,以及常见的算法如深度优先搜索、广度优先搜索、动态规划、回溯等。 3. 实现算法:使用Java编写算法的解决方案。根据题目的要求,我们可以使用类、方法等来组织和实现代码。 4. 编写测试用例:为了验证解决方案的正确性,编写测试用例是必不可少的。测试用例应该包括各种情况,包括边界情况和一般情况。 5. 运行和测试:运行编写的代码,并使用编写的测试用例进行测试。通过测试用例的执行结果,我们可以判断代码的正确性和性能。 在编写测试用例时,我们应该考虑尽可能多的情况,以确保代码的正确性。测试用例应该包括输入数据和预期输出结果。可以使用JUnit等测试框架来组织和运行测试用例。 总结来说,Java的LeetCode编程需要认真阅读题目,分析问题,设计具体的解决方案,并使用合适的数据结构和算法进行实现。编写测试用例是验证解决方案正确性的重要步骤,可以使用JUnit等测试框架来辅助进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.2626

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值