首页 > 其他分享 >力扣977题(双指针)

力扣977题(双指针)

时间:2023-06-10 12:35:58浏览次数:40  
标签:977 end nums sqr beg 力扣 vec 数组 指针

  • 所用算法:双指针
  • 观察题目的规律,平方之后该数组两边的数大,中间的数小,因此想到双指针,一个指针指向数组的开头,一个指针指向数组的结尾。
  • 如果你觉得在原数组上操作会将未遍历的元素覆盖掉,那么一定要开辟一个新的数组,将原数组的值赋给新的数组。

  (比如一个数组平方之后的数组是{4,1,0,9,16})因为你不知道下一组的数(比如第一组是4和16,下一组是1和9)中                                  是否有比4大的数,因此不应该更新指向4位置的索引值,也不应该将4装进新数组中。

  • 首先来看一个错误的代码:
    vector<int> sortedSquares(vector<int>& nums) {
        int beg=0,end=nums.size()-1;
        int beg_sqr=nums[beg]*nums[beg],end_sqr=nums[end]*nums[end];
        vector<int>vec;
        if(nums.size()==1)
        {
            nums[beg]=beg_sqr;
            return nums;
        }
        while(beg<=end)
        {
            if(beg_sqr>=end_sqr)
            {
                vec.emplace(vec.begin(), beg_sqr);
                ++beg;
                beg_sqr=nums[beg]*nums[beg];
            }
            else
            {
                vec.emplace(vec.begin(), end_sqr);
                --end;
                end_sqr=nums[end]*nums[end];
            }
        }
        return vec;
    }

++beg和--end都可能造成索引的越界,因此吸取到的经验是,一定要将改变索引值的语句放在程序的最后,这样运行到while循环就可以很好的防止越界问题,那么索引值的改变语句放在了程序的最后我又想利用这个索引值该怎么办呢,解决方法就是将利用索引值的语句(也就是那个平方语句)放在程序的开头,这就相当于将while语句插在了两个语句的中间。

  • 正确代码
 1     vector<int> sortedSquares(vector<int>& nums) {
 2         int beg=0,end=nums.size()-1,k=nums.size()-1;
 3         vector<int>vec(nums.size());//此处一定要赋值,因为下标不能对空的容器进行任何的操作,最好不要用下标输出空数组的元素,因为可能会出现未知的值
 4         while(beg<=end)
 5         {
 6             if(nums[beg]*nums[beg]>=nums[end]*nums[end])
 7             {
 8                 vec[k--]=nums[beg]*nums[beg];//这个地方学到了怎么对数组或则容器向前追加,最好不要在这个地方用模板(vec.emplace(vec.begin(), nums[end]*nums[end]);)力扣显示这样做时间复杂度会增加
 9                 ++beg;
10             }
11             else
12             {
13                 vec[k--]=nums[end]*nums[end];
14                 --end;
15             }
16         }
17         return vec;
18     }

 

标签:977,end,nums,sqr,beg,力扣,vec,数组,指针
From: https://www.cnblogs.com/Sandals-little/p/17471074.html

相关文章

  • C语言的指针
    1.初步理解指针C语言的指针指的是一个地址,也是内存单元的编号,它存储的是内存地址.#include<stdio.h>intmain(){//初始化一个变量a的值inta=10;//定义一个指针p指向变量a的地址,int*表示这个变量存放的是int类型的地址int*p=&a;//打印这个指针所指向的变量......
  • C++面试八股文:指针占用多少个字节?
    C++面试八股文:指针占用多少个字节?某日小二参加XXX科技公司的C++工程师开发岗位4面:面试官:memset、memcpy和strcpy的区别是什么?小二:memset用于将一块内存设置为特定的值,memcpy用于将一块内存从一个位置复制到另一个位置,strcpy用于将一个字符串从一个位置复制到另一个位......
  • 在 c++ 中删除一个 NULL pointer (空指针)
    @is21201.在c++中删除一个NULLpointer(空指针)是安全的2.标准中相关内容如下:"Ineitheralternative,ifthevalueoftheoperandofdeleteisthenullpointertheoperationhasnoeffect."3.一个有用的宏@is2120#definemy_delete(x){deletex;x=NULL;} 4......
  • boost库之智能指针
    一、boost::scoped_ptrboost::scoped_ptr是Boost库中的一个智能指针类,用于管理动态分配的对象,并确保在超出作用域时自动释放资源。boost::scoped_ptr提供了一种简单而安全的方式来管理对象的生命周期。它的行为类似于C++原始指针,但它负责在其生命周期结束时自动调用delete来释放......
  • 力扣---2462. 雇佣 K 位工人的总代价
    给你一个下标从0 开始的整数数组 costs ,其中 costs[i] 是雇佣第i 位工人的代价。同时给你两个整数 k和 candidates 。我们想根据以下规则恰好雇佣 k 位工人:总共进行 k 轮雇佣,且每一轮恰好雇佣一位工人。在每一轮雇佣中,从最前面candidates 和最后面candidates......
  • 下标,指针,迭代器
    1//使用下标遍历数组中的元素2inta[4]={1,2,3,4};3for(size_ti=0;i<4;++i)4{5cout<<a[i]<<endl;6}1//使用下标任意访问数组中某个元素2inta[4]={1,2,3,4};3cout<<a[1]<<endl;1//使用指针访问遍历数组中......
  • C++ 指针
    一、什么是指针?1、指针是一个变量,其值为另一个变量的地址2、double*类型是一种指针类型,用于指向double类型的内存地址3、指针的值都是代表内存地址的十六进制数二、C++中使用指针实例#include<iostream>usingnamespacestd;intmain(){intvar=20;/......
  • C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?
    C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?某日小二参加XXX科技公司的C++工程师开发岗位2面:面试官:指针、引用、解引用和取地址是C++中的重要概念,请问它们在语法和语义上有所不同?小二:指针是一个变量,它存储了一个内存地址。小二:引用是一个别名,它允许使用一个......
  • 指针
    指针类型决定了指针进行解引用操作的时候,能够访问空间的大小。指针的类型决定了指针向前或向后走一步有多大(距离)野指针:野指针就是指针指向的位置是不可知的(随机的不正确的没有明确限制的)1.指针未初始化int*p;//局部变量指针未初始化,默认随机值*p=20;2.指针越界访问intarr[10]={0}......
  • 智能指针
        今天主要是总结下我刚学习的智能指针,分为四方面进行智能指针的整理。注意:本次使用的编译语言为C++,编译器为VS2013。下面直接开始今天的正题吧为什么要使用智能指针?首先我们先来看一段代码:intmain(){ try{ int*p=newint[10];//动态分配内存失败 throwstd::......