每日一题(LeetCode)----数组--移除元素(五)

news/2024/7/24 7:30:45 标签: leetcode, 算法

每日一题(LeetCode)----数组–移除元素(五)

1.题目([leetcode.cn/problems/squares-of-a-sorted-array/">977. 有序数组的平方](https://leetcode.cn/problems/sqrtx/))

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

示例 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 已按 非递减顺序 排序

进阶:

  • 请你设计时间复杂度为 O(n)算法解决本问题

2.解题思路

思路一: 双指针法

通过观察发现正数(包括零)平方后从左向右递增,负数平方后从右向左递增,所以我们先找到第一个不是负数的位置,然后找到最后一个负数的位置,将这组数进行平方操作,并放到一个新创建的vector中,最后从第一个不是负数的位置向左遍历,最后一个负数的位置向右遍历将这两个指针遍历到的数进行比较,然后依次往原有vector中放入排序好的元素注意如果某一指针移至边界了,那么就将另一指针还未遍历到的数依次放入到原有vector中排好序的元素的后面。

思路二: 双指针法

我们可以使用两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。这种方法无需处理某一指针移动至边界的情况,读者可以仔细思考其精髓所在。

原作者:力扣官方题解
leetcodecnproblemsbackspacestringcompare_48">链接:https://leetcode.cn/problems/backspace-string-compare/

3.写出代码

思路一的代码:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
            int length = nums.size();
            int poIndex = -1;
            //找到第一个不是负数的下标
            for (int i = 0; i < length; i++) {
                if (nums[i] >= 0) {
                    poIndex = i;
                    break;
                }
            }
            //找到最后一个负数的下标
            int neIndex;
            if (poIndex == -1) {
                neIndex = nums.size()-1;
            }
            else {
                neIndex = poIndex - 1;
            }

            //将这组数进行平方操作,并放到一个新创建的vector中
            vector<int> Temp;
            for (int i = 0; i < length; i++) {
                Temp.push_back(nums[i] * nums[i]);
            }

            //从中间往两边进行比较,然后依次往原有vector中放入排序好的元素
            int i = 0;
            while ((poIndex <=( nums.size() - 1)) && neIndex>=0) {
                if (Temp[poIndex] > Temp[neIndex]) {
                    nums[i++] = Temp[neIndex--];
                }
                else {
                    nums[i++] = Temp[poIndex++];
                }
            }
            while (poIndex <= nums.size() - 1) {
                nums[i++] = Temp[poIndex++];
            }

            while (neIndex >= 0) {
                nums[i++] = Temp[neIndex--];
            }

            return nums;

    }
};

思路二的代码:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n);
        for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
            if (nums[i] * nums[i] > nums[j] * nums[j]) {
                ans[pos] = nums[i] * nums[i];
                ++i;
            }
            else {
                ans[pos] = nums[j] * nums[j];
                --j;
            }
            --pos;
        }
        return ans;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原作者:力扣官方题解
leetcodecnproblemsbackspacestringcompare_137">链接:https://leetcode.cn/problems/backspace-string-compare/

http://www.niftyadmin.cn/n/5171777.html

相关文章

C++抽象类和纯虚函数

C中的抽象类是指包含至少一个纯虚函数的类。纯虚函数是指没有实现&#xff0c;需要在派生类中重写的函数。 例如&#xff0c;下面是一个抽象类的例子&#xff1a; class Shape { public:virtual float getArea() 0; // 纯虚函数virtual float getPerimeter() 0; // 纯虚函数…

LeetCode:2300. 咒语和药水的成功对数(C++)

目录 2300. 咒语和药水的成功对数 题目描述&#xff1a; 实现代码与解析&#xff1a; 二分 原理思路&#xff1a; 2300. 咒语和药水的成功对数 题目描述&#xff1a; 给你两个正整数数组 spells 和 potions &#xff0c;长度分别为 n 和 m &#xff0c;其中 spells[i] 表…

Uniapp实现时间选择器

Uniapp是一款基于Vue.js开发的跨平台应用框架&#xff0c;可以快速构建多端的移动应用。要在Uniapp中实现时间选择器&#xff0c;可以借助uni-datetime-picker组件来完成。 步骤 以下是在Uniapp中实现时间选择器的步骤&#xff1a; 在需要使用时间选择器的页面中引入 uni-date…

好物周刊#30:Github 上大学

https://github.com/cunyu1943/JavaPark https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. Fighting Design 一款灵活、优质的组件库&#xff0c;可在 vue3 应用程…

归并分治 计算数组的小和 + 图解 + 笔记

归并分治 前置知识&#xff1a;讲解021-归并排序 归并排序 图解 递归 非递归 笔记-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134338789?spm1001.2014.3001.5501原理&#xff1a; (1&#xff09;思考一个问题在大范围上的答案&#xff0c;是否等于&…

Sprint Boot 学习路线 4

微服务 Spring Microservices是一个框架&#xff0c;它使用Spring框架更容易地构建和管理基于微服务的应用程序。微服务是一种架构风格&#xff0c;其中一个大型应用程序被构建为一组小型、独立可部署的服务。每个服务具有明确定义的职责&#xff0c;并通过API与其他服务通信。…

【沐风老师】3DMAX克隆修改器插件教程

3DMAX克隆修改器插件&#xff0c;它通过增量平移、旋转和缩放输入几何体来创建对象的副本。在某些方面&#xff0c;它类似于 3ds Max 的内置阵列工具&#xff0c;但有一个主要优点 -克隆是完全参数化的&#xff0c;因此您可以随时更改重复项的数量及其分布。其他功能包括随机变…

vmware开启ipv6

说明 在 ipv4 基础上配置ipv6网络。 分享 大数据博客列表开发记录汇总个人java工具库 项目https://gitee.com/wangzonghui/object-tool 包含json、string、集合、excel、zip压缩、pdf、bytes、http等多种工具&#xff0c;欢迎使用。 vm开启ipv6 设置vmware 打开vmware点击编…