草庐IT

力扣刷题02

z轩 2023-03-28 原文

977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 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 已按 非递减顺序 排序
class Solution {
    public int[] sortedSquares(int[] nums) {
       int length=nums.length-1;
       int[] arr=new int[length+1];
       int left=0;
       int right=length;
       while(left<=right){
           if(nums[left]*nums[left]<nums[right]*nums[right]){
                arr[length--]=nums[right]*nums[right];
                right--;
            
           }else{
               arr[length--]=nums[left]*nums[left];
               left++;
           }
       }
       return arr;
    }
}

反思

这道题思路不难,但是要注意的是数组边界的问题。

设置的新数组的长度应该跟原数组的一样长,那么接下来就是双指针的用法,这题需要注意的就是要以非递减,那么我们应该留意数组中是否有负数,如果有负数,应该怎么办。

最主要需要判断的是负数的平方和正数的平方哪个大,这样才好排序。设置两个指针,一个指向原数组的头,一个指向尾,比较头尾两个数平方的大小,大的先插入新数组的尾部,(如果是尾部的大,那么指针左移,如果是头部的大,那么指针右移)。时间复杂度是O(n)

189. 轮转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

思路

将需要移动的k长度数组直接拷贝到临时数组里,再在原数组的基础上,先把length-k个数往后移动k个位置,再从临时数组把数赋到原数组的前k个位置

class Solution {
    public void rotate(int[] nums, int k) {
        k=k%nums.length;
        if(k==0){
            return;
        }
        int[] arr=Arrays.copyOfRange(nums,nums.length-k,nums.length);
        for(int i=nums.length-1;i>=k;i--){
            nums[i]=nums[i-k];
        }
        for(int i=0;i<k;i++){
            nums[i]=arr[i];
        }
    }
}

反思

该题思路应该是没问题,但是要在代码实现上踩坑。

在变化原数组时要考虑数组的长度问题,k位置的数要不要包含。

其他的队列等方法可以之后再进行解决

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

思路

快慢指针:快指针用来处理数据,慢指针用来标记处理好的数据,快指针不断右移,快指针不为0的数赋值给慢指针处,处理完之后将慢指针后面的数值赋0

class Solution {
    public void moveZeroes(int[] nums) {
            int slow=0;
            for(int fast=0;fast<=nums.length-1;fast++){
                if(nums[fast]!=0){
                    nums[slow]=nums[fast];
                    slow++;
                }
            }
            for(int j=slow;j<=nums.length-1;j++){
                nums[j]=0;
            }
        }
    }

反思

关于边界问题

注意数组的最后一个数也要遍历到

167. 两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1]numbers[index2] ,则 1 <= index1 < index2 <= numbers.length

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1index2

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

提示:

  • 2 <= numbers.length <= 3 * 104
  • -1000 <= numbers[i] <= 1000
  • numbers非递减顺序 排列
  • -1000 <= target <= 1000
  • 仅存在一个有效答案

思路

双指针的用法,题中给的非递减可以作为参考,如果左右相加大于目标值,右指针左移,如果小于目标值,左指针右移;

最后取下标时一定要记得+1

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int l=0;
        int r=numbers.length-1;
        int[] arr=new int[2];
        while(l<=r){
            if(numbers[l]+numbers[r]<target){
                l++;
            }else if(numbers[l]+numbers[r]>target){
                r--;
            }else{
                arr[0]=l+1;
                arr[1]=r+1;
                return arr;
            }
        }
 
        return null;
    }
}

有关力扣刷题02的更多相关文章

  1. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  2. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  3. Ruby:为什么 1.025.round(2) 四舍五入为 1.02? - 2

    据我了解.round()-ruby中的功能将小数向上舍入,最后一个有效数字是5?例如1.5.round(0)#=>2(OK)但为什么1.025.round(2)#=>1.02而不是我期望的1.03?irb(main):037:0>1.025.round(2)=>1.02我该怎么做才能解决这个问题? 最佳答案 这与最后一位数字为5无关,与将十进制值转换为double浮点值有关。http://en.wikipedia.org/wiki/Double_precision_floating-point_format基本上,十进制数必须以有限

  4. Elasticsearch--02.Kibana8.1.0安装 - 2

    1.下载安装概述:Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。下载地址:Kibana8.1.0|Elastic解压到指定目录:tar-xzvfkibana-8.1.0-linux-x86_64.tar.gz-C/opt/module/2.Kibana生成证书文件在es服务器中生成证书、直接回车cd/opt/module/elasticsearch-8.1.0/bin/elasticsearch-certutilcsr-namekibana-dns

  5. 【愚公系列】2023年02月 微信小程序-Flex布局详解 - 2

    文章目录一、Flex布局详解1.Flex布局的概念1.1传统布局1.2Flex布局1.3Flex布局声明2.Flex布局的容器属性2.1flex-direction属性2.2flex-wrap属性2.3flex-flow属性2.4justify-content属性2.5align-items属性2.6align-content属性3.Flex布局的项目属性3.1order属性3.2flex-grow属性3.3flex-shrink属性3.4flex-basis属性3.5flex属性3.6align-self属性总结一、Flex布局详解1.Flex布局的概念1.1传统布局盒子模型:我们知道当并列

  6. 面试总结+力扣第二天刷题 - 2

    一.面试总结    4月20号下午进行了一场大数据视频面试,总结一下踩坑点:    1.确定面试后,第一件事要和HR确定面试方式,具体时间、地点、什么软件、岗位JD等必须信息。        这里很多人有一个思想误区,认为问的太多会给HR不好的印象;其实大可不必,如果你通过了简历筛选,你就有权力使用公司招聘的人力资源。    2.要在面试10分钟前就进入面试的环境中,以防突发事件。    3.面试最开始都会有一个自我介绍环节,这个自我介绍环节,一定要慎之又慎,最好写下来,让朋友、长辈等审核多遍。    注:我面试时,在这踩了一个坑,自我介绍的时候踩了我要面试的岗位一脚,被技术面试官抓住了这一点

  7. 华为OD机试 - 删除最少字符(Python) | 机试题算法思路 【2023-02】 - 2

    最近更新的博客华为OD机试-数组合并(Python),真题含思路华为OD机试-最近的医院(Python),简单直白疑问搞懂,python中文词频统计,让你真能学会华为OD机试-最小传递延迟(Python)|代码编写思路+核心知识点字体反爬,一种来自字体设计师的跨行反爬案例|案例282023新华为OD机试题-事件推送(JavaScript)|刷完必过使用说明参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。华为OD清单查看地址:blog.csdn.net/hihell/category_12199275.html华为O

  8. 嵌入式UI框架 LVGL 学习笔记 02 页面管理和主题定制 - 2

    LVGL页面切换LVGL中没有明确的页面切换方案,参考(2.6#lvgl-多页面(screen)设定/切换)根据实际可用API,可以考虑两种方案:通过FLAG(LV_OBJ_FLAG_HIDDEN)隐藏或者显示lv_obj_add_flag/lv_obj_clear_flag根UI控件通过管理child节点的对象来实现lv_obj_set_parent/lv_obj_get_child通过屏幕显示obj切换lv_scr_load/lv_scr_load_anim与参考文章不同的是,这里更建议使用1和2两种方式进行管理。具体场景如下:如果是简单页面,没有标题,页脚,侧边栏等复杂元素,建议使用3。

  9. 02 openEuler操作系统的安装 - 2

    文章目录02openEuler操作系统的安装2.1openEuler操作系统的安装流程2.2openEuler操作系统的安装详细步骤2.2.1下载地址2.2.2创建虚拟机2.2.2.1方法一:典型配置2.2.2.2方法二:自定义配置2.2.3安装过程02openEuler操作系统的安装2.1openEuler操作系统的安装流程2.2openEuler操作系统的安装详细步骤本次介绍openEuler22.03-LTS基于X86架构的安装。2.2.1下载地址官网下载地址:https://www.openeuler.org/zh/download/根据你的实际需求选择适合架构平台的ISO系统镜像下载

  10. 02、威尔金森功分器 - 2

    1、引言功率分配器属于无源微波器件(电路具有对称性),主要应用于功率分配。工程上常用的功率分配器件有T型结功分器、威尔金森功分器。功率分配器通常采用三端口网络,常用3dB等分形式,但也有不等分的形式。本文主要介绍威尔金森功分器的设计。2、工作原理威尔金森功率分配器的功能是将输入信号等分或不等分的分配到各个输出端口,并保持相同输出相位。T型结功分器虽然有类似功能,但威尔金森功率分配器在应用上因添加了隔离电阻而具有更高的隔离度同时也具有更宽的带宽。3、原理图仿真(1)设计要求板材:Rogers5880,Er=2.2,TanD=0.0009,H=0.762mm工作频率:3GHz威尔金森功分器与普通的

随机推荐