java数据结构与算法刷题-----LeetCode977. 有序数组的平方

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • [1. 时间复杂度 = 空间复杂度 = O(n * l o g 2 n log_2{n} log2n)</kbd>](#1. 时间复杂度 = 空间复杂度 = O(n * l o g 2 n log_2{n} log2n))
    • [2. 时间复杂度O(n),空间复杂度O(1)](#2. 时间复杂度O(n),空间复杂度O(1))

1. 时间复杂度 = 空间复杂度 = O(n * l o g 2 n log_2{n} log2n)

解题思路
  1. 最直接的想法就是先算出每个元素的平方和,然后排序,所以排序的效率就是这个算法的效率。那么目前综合性能比最好,实现也简单的就是快速排序算法,它的时间和空间复杂度为O(n * l o g 2 n log_2{n} log2n)
快速排序https://blog.csdn.net/grd_java/article/details/135671368
代码:时间复杂度O(n * l o g 2 n log_2{n} log2n).空间复杂度O(n * l o g 2 n log_2{n} log2n)
java 复制代码
class Solution {
    public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = (int)Math.pow(nums[i],2.0);
        }
//        quickSort(nums);
        Arrays.sort(nums);
        return nums;
    }
    /**快速排序,不稳定,时间复杂度O(n * logn) 空间复杂度O(n*logn)
     * 这里是快排入口
     */
    public void quickSort(int arr[]){
        quickSort(arr,0,arr.length-1);
    }

    /**
     * 递归主要用于分割左右两个表
     */
    public void quickSort(int arr[],int low,int high){
        if(low<high){//如果左指针超过右指针,表示本次比较完成
            //快速排序,每一趟都会确定一个元素的最终位置,用pivot表示,pivot是枢纽的意思
            int pivotPosition = quickSortPartition(arr, low, high);
            //由pivot为分界点,分成左右两个表
            quickSort(arr,low,pivotPosition-1);//左表排序
            quickSort(arr,pivotPosition+1,high);//右表排序
        }
    }

    /**
     * 这里是每一趟的快速排序代码,指定一个元素作为枢纽pivot,然后以它为中心,小的元素放在它左边,大的放在它右边
     */
    public int quickSortPartition(int arr[],int low,int high){
        int pivot = arr[low];//指定枢纽
        while (low<high){
            while(low<high && arr[high]>=pivot) --high;//从右边找到比枢纽小的
            arr[low] = arr[high];//放在左边
            while(low<high && arr[low]<=pivot) ++low;//从左找到比枢纽大的
            arr[high] = arr[low];//放在右边
        }
        arr[low] = pivot;//最终将枢纽放到它最终的位置
        return low;//最终low指向枢纽最终位置
    }
}

2. 时间复杂度O(n),空间复杂度O(1)

其实直接用排序算法,有些太奢侈了,而上面快速排序主要用双指针的思想。那么我们直接用双指针做这道题,是不是更好呢?

代码:时间复杂度O(n).空间复杂度O(1)
java 复制代码
class Solution {
    public int[] sortedSquares(int[] nums) {
        int n = nums.length;//数组长度
        int low = 0, high = n -1;//左右指针
        int position = n-1;//答案数组的指针,从后向前,依次指向插入元素的位置
        int[] answer = new int[n];//每次都将较大值从后向前插入position指向的位置
        while(high >= low){
            int leftPow = nums[low]*nums[low];//获取边的平方和
            int rightPow = nums[high] * nums[high];//获取右边的平方和
            //将较大的插入answer数组,并移动指针
            if(leftPow > rightPow) {answer[position] = leftPow; low++;}//左边的插入answer,左指针向右移
            else {answer[position] = rightPow; high--;}//右边元素插入answer,右指针向左移动
            position --;//指向下一个插入位置,从后往前依次插入
        }
        return answer;
    }
}
相关推荐
程序员黑豆4 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
江畔柳前堤5 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
hey_sml5 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo5 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore6 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
萧瑟余晖7 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才7 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio7 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
罗西的思考8 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX8 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm