代码随想录 day 2 | 977.有序数组的平方

文档讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep
看讲解前状态:不会
看讲解后状态:有思路
二刷状态:

基础知识:

  • vector result(A.size(), 0);
    这段代码使用了C++标准库中的 vector 容器,创建一个整数向量 result,该向量的大小与对象 A 中的元素数量相同,每个元素都被初始化为整数值 0。

    • vector:这是C++标准库中的容器之一,用于存储一组具有相同类型的元素。在这里,我们使用了 vector 来创建一个存储整数类型的向量。

    • result:这是你所创建的整数向量的名称,你可以根据需要为向量取任何合适的名称。

    • A.size():这是一个名为 A 的对象(可能是一个向量或数组),通过 .size() 成员函数获取了其元素的数量(大小)。

    • 0:这是一个初始值,用于初始化 result 中的每个元素。

  • 这可以用于在后续的代码中存储一些与问题相关的数据,例如计数、累加等。

题目:

https://leetcode.cn/problems/squares-of-a-sorted-array/

法一:暴力排序法

代码实现:
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k =nums.size()-1;
        vector<int> result(nums.size(),0);//创建一个整数向量result,大小与nums的元素数量相同,每个元素都被初始化为0。
        for (int i=0,j=nums.size()-1;i<=j;){
            if (nums[i]*nums[i]>nums[j]*nums[j]){
                result[k--] = nums[i]*nums[i];
                i++;
            }
            else{
                result[k--] = nums[j]*nums[j];
                j--;
            }
        }
        return result;
    }
};
时间复杂度:O(n + nlogn)

法二:双指针法

解题关键:

  • 比较i处J处元素谁大,谁大谁i++,j–,并付给k值

解题思路:

  • 题目可看出平方后(大->小<-大),所以可用两个指针操作,逐步由量变向中间合拢,得到一个由大到小的数组(两边比较,覆盖替换),类似于27移除元素中的相向双指针法。

    • 由于我们得到的结果是(大->小),而题目要求为(小->大),所以可以吧得到的数组下标反向更新,下标直接由大到小更新。
      通过指定数组末元素下标k=nums.size-1,每一步都k–来更新。
  • for(i=0,j=nums.size - 1;i<=j;) 不是i<j的原因:若i<j,则当i=j时,那个元素就会被落下。

    • 此处不写i++,j–,因为需要满足一定条件才进行i++,j–
    • 只有I处为最大值才i++,j处为最大值才j–
  • 看上去忽略了nums[i]^2与 nums[j]^2相等的情况,但实际上,当他两相等时,通过j、i任意一个更新都一样,另一个值不更新直接参与下一次比较即可。所以直接else。

代码实现:
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k =nums.size()-1;
        vector<int> result(nums.size(),0);//创建一个整数向量result,大小与nums的元素数量相同,每个元素都被初始化为0。
        for (int i=0,j=nums.size()-1;i<=j;){
            if (nums[i]*nums[i]>nums[j]*nums[j]){
                result[k--] = nums[i]*nums[i];
                i++;
            }
            else{
                result[k--] = nums[j]*nums[j];
                j--;
            }
        }
        return result;
    }
};
时间复杂度:O(n)

☹☹☹遇到的问题:

  • vector不熟悉
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值