IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【每日一题】有序数组的平方 -> 正文阅读

[数据结构与算法]【每日一题】有序数组的平方

🌟个人博客:www.hellocode.top🌟
?所有文章均在上方博客首发,其他平台同步更新
🔥本文专栏:《每日一题》
?如有问题,欢迎指正,一起学习~~
文章部分参考《代码随想录》,如有侵权,请联系删除~~


  • 时间:2022-05-10

  • 题目序号:977

  • 难度:简单

问题描述

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

来源:力扣(LeetCode)

示例1

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例2

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

解题思路

题解部分参考自代码随想录。如有侵权,请联系进行删除~~

  • 在解题时,我们都可以先思考暴力解法进行解题,然后再通过逐步优化,来提高代码的性能
  • 对于本题,可以通过暴力和双指针两种方法进行解决

暴力解法

  • 根据本题的题目描述,暴力解法其实很容易就能想到
  • 直接通过for循环遍历数组,让nums[i] *= nums[i]即可
  • 在遍历结束后,数组内的值就已经是平方后的值了,只不过不是按顺序排列,使用Arrays里的sort方法进行排序即可(快排)

双指针解法

img

  • 原数组中的元素其实是有序的,主要是进行平方后数组中数据的排序
  • 不难想到,平方后,最大的值一定是最左边或者最右边的值,不可能是中间的元素
  • 因此,可以定义两个指针,一个指向数组首元素,一个指向数组尾元素
  • 根据上图中的if条件进行判断循环,最终即可获得有序的平方值

代码实现

通过上述分析,分别可以通过暴力解法和双指针解法两种方式来实现移除元素

暴力解法

class Solution {
    public int[] sortedSquares(int[] nums) {
		for(int i = 0; i < nums.length; i++){
            nums[i] *= nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }
}

  • 时间复杂度:O(nlogn)

双指针解法

class Solution {
    public int[] sortedSquares(int[] nums) {
        int size = nums.length;
        int[] result = new int[size];
        int left = 0;
        int right = size - 1;
        int index = size - 1;
        while(left <= right){
            if(nums[left] * nums[left] < nums[right] * nums[right]){
                result[index--] = nums[right] * nums[right];
                right--;
            }else{
                result[index--] = nums[left] * nums[left];
                left++;
            }
        }
        return result;
    }
}

  • 时间复杂度:O(n)

总结

  • 一般遇到一个问题时,可以先考虑暴力解法,然后再考虑其他更加高效的算法或者对暴力解法进行不断优化,来提高算法的效率
  • 数组操作中的很多地方都会用到双指针解法,所以对于双指针一定要掌握并能够灵活的运用
  • 在有索引的地方,对于临界值的判断一定要准确,什么时候<=,什么时候<,要能够分清
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:54:13  更:2022-05-18 17:56:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:49:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码