首页 > 其他分享 >LeeCode刷题记录2——有序数组的平方

LeeCode刷题记录2——有序数组的平方

时间:2023-03-15 12:44:06浏览次数:39  
标签:平方 nums int negative LeeCode vector ans 刷题 指针

官方解法:双指针

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();//声明变量n为数组的长度
        int negative = -1;//先声明一个变量,等下作为负数的位置的指针
        for (int i = 0; i < n; ++i) {//查找负数
            if (nums[i] < 0) {
                negative = i;//用变量negative记录负数的位置
            } else {
                break;//找不到就跳出循环
            }
        }

        vector<int> ans;//定义函数
        int i = negative, j = negative + 1;//定义左指针i,起始位置为最后一个负数的位置,定义右指针j,起始位置为第一个正数的位置
        while (i >= 0 || j < n) {
        //当左指针或者右指针在数组的范围内时执行循环。
        //用循环来形成一个新的栈,当负数的平方小于正数时,负数的平方先入栈,否则正数的平方先入栈。
        //当其中左指针或者右指针到底数组边界时,不再进行比较,而是直接让接下来的数入栈。
            if (i < 0) {
                ans.push_back(nums[j] * nums[j]);
                ++j;
            }
            else if (j == n) {
                ans.push_back(nums[i] * nums[i]);
                --i;
            }
            else if (nums[i] * nums[i] < nums[j] * nums[j]) {
                ans.push_back(nums[i] * nums[i]);
                --i;
            }
            else {
                ans.push_back(nums[j] * nums[j]);
                ++j;
            }
        }

        return ans;
    }
};


作者:力扣官方题解
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solutions/447736/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我参考评论区之后,发现有更为简便的算法:
1.可以减少if的使用,官方使用了四个if,但其实可以只使用两个,这样执行时间和内存占用好像都有减少(好像是,因为我看见比这个内存占用更少的和执行时间更短的算法都是这个思路)

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> res(nums.size());
        for(int i = 0;i<nums.size();++i)
        {
            nums[i] = nums[i] * nums[i];//先将数组里面每一个数先平方了
        }
        int left = 0, right = nums.size()-1;//初始化左指针和右指针的位置为左边界和右边界
        int pri = right;//将pri的长度滴定义为n的长度
        while(left <= right)
        {//当左边界小于右边界时执行循环,每执行一次左右边界就相互靠近,最后生成一个完整的数组res
            //如果左指针位置上的数小于右指针位置上的数,则左指针位置上的数先入数组,否则右指针位置上的数先入数组
            if(nums[left] <= nums[right])
            {
                res[pri] = nums[right];
                right--;
            }
            else if(nums[left] > nums[right])
            {
                res[pri] = nums[left];
                left++;
            }
            pri--;
        }
        return res;

    }
};

标签:平方,nums,int,negative,LeeCode,vector,ans,刷题,指针
From: https://www.cnblogs.com/apeiriaDolce/p/17216284.html

相关文章

  • 力扣 (LeetCode)刷题--704. 二分查找
    二分查找是一个非常基础的算法给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示......
  • CHATGPT:OI刷题怎么提高建模能力
    1多做题:刷题是提高建模能力的最好方式。多做题可以帮助学生了解不同问题的求解思路和方法,从而在解决新问题时更有思路。2关注经典问题:经典问题是经过长期实践和研究后得出的......
  • 反序列化刷题
    web259 flag.php<?php$xff=explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);array_pop($xff);$ip=array_pop($xff);if($ip!=='127.0.0.1'){die('erro......
  • 2023/03/09刷题
    链接B-EqualRectangles这个题还是比较有意思的因为有4n个,我们可以发现我们如果把序列排序的话必然有两个数字肯定是一模一样的,因为是长方形的两个边,我们还可以发现......
  • 2023/03/11刷题
    A.MinimizingtheString链接A.MinimizingtheString这个题的意思就是删除一个字母让字符串的字典序变得最小,如果字符串的顺序是abcda的话很明显我们要删除d所以我......
  • LeeCode例题——二分查找
    1.二分查找:(面对一个升序排列的数组)classSoulution{public:intsearch(vector<int>&nums,inttarget){//函数名(数组,变量)intleft=0,right=nums.size()-......
  • 【LeeCode】350. 两个数组的交集 II
    【题目描述】给你两个整数数组 ​​nums1​​ 和 ​​nums2​​ ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致......
  • 2023/03/08刷题
    C.AlphabeticRemovals链接C.AlphabeticRemovals这个题先找到需要去除的k个字符,然后再打印的时候去除这些字符就可以了#include<iostream>#include<algorithm>......
  • 【LeeCode】349. 两个数组的交集
    【题目描述】给定两个数组 ​​nums1​​ 和 ​​nums2​​ ,返回 它们的交集 唯一 的。我们可以 不考虑输出结果的顺序 。​​​​https://leetcode.cn/problems/i......
  • 69. x 的平方根
    https://leetcode.cn/problems/sqrtx/ 给你一个非负整数x,计算并返回 x 的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。注意:不允许......