冲冲冲,力扣javascript刷题——数组总结

news2024/9/28 23:26:34

力扣javascript刷题——数组总结

  • 冲冲冲,力扣刷题——数组总结
    • 1.二分查找
      • 力扣704题:二分查找
      • 35.搜索插入位置
      • 34.在排序数组中查找元素的第一个和最后一个位置
      • 69.x 的平方根
      • 367. 有效的完全平方数
    • 2.双指针法
      • 27. 移除元素
      • 26. 删除有序数组中的重复项
      • 283.移动零
      • 844. 比较含退格的字符串
      • 977. 有序数组的平方
    • 3.滑动窗口
      • 209.长度最小的子数组
      • 904.水果成篮(努力理解中...)
      • 76.最小覆盖子串(未解决)
    • 4.模拟行为
      • 54.螺旋矩阵

冲冲冲,力扣刷题——数组总结

陆陆续续把数组的力扣经典题刷完了,刷完后还是会出现忘记的情况,先对刷过的题进行总结,好记性不如烂笔头,冲冲冲~

1.二分查找

力扣704题:二分查找

在这里插入图片描述

这个题的关键点在于升序数组无重复,这种题最适合用二分法,用二分法的一个重要技术点就是边界问题,这里需要注意的是区间不变量,比如,下面的解法就是坚持left>=right,即我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right]

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
     var left=0;
     var right=nums.length-1;
     var mid=0;
     while(left<=right){
         mid=left+((right-left)>>1);
         if(nums[mid]==target){
             return mid;
         }else if(nums[mid]>target){
             right=mid-1;
         }else{
             left=mid+1;
         }
     }
     return -1;
};

35.搜索插入位置

在这里插入图片描述
这个题和上面的题很类似:

/**
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
   var left=0;
   var right=nums.length-1;
   var mid=0;
   while(left<=right){
       mid=left+((right-left)>>1);
       if(nums[mid]==target){
           return mid;
       }else if(nums[mid]>target)
       {
           right=mid-1;
       }else{
           left=mid+1;
       }
   }
   return left;
};

34.在排序数组中查找元素的第一个和最后一个位置

在这里插入图片描述

这个题的关键词:非递减顺序有重复:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function(nums, target) {
    var left=0;
    var right=nums.length-1;
    var resultNums=[];
    var mid=0;
    while(left<=right){
        mid=left+((right-left)>>1);
        if(nums[mid]==target){
            var i=mid
            while(nums[i]==nums[i-1]){
                i--;
            }
            resultNums[0]=i;
            while(nums[i]==nums[i+1]){
                i++;
            }
            resultNums[1]=i;
            return resultNums;
        }else if(nums[mid]>target){
            right=mid-1;
        }else{
            left=mid+1;
        }
    }
    return [-1,-1];
};

69.x 的平方根

在这里插入图片描述
虽然这个题不是数组了,但是整体结构还是像数组,数组的二分法思想照样可以用在这里;

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
   var left=0;
   var right=x;
   var mid=0;
   while(left<=right){
       mid=left+((right-left)>>1);
       if(mid*mid==x){
           return mid;
       }else if(mid*mid>x){
           right=mid-1;
       }else{
           left=mid+1;
       }
   }
   return right;
};

367. 有效的完全平方数

在这里插入图片描述

/**
 * @param {number} num
 * @return {boolean}
 */
var isPerfectSquare = function(num) {
    var left=0;
    var right=num;
    var mid=0;
    while(left<=right){
        mid=left+((right-left)>>1);
        if(mid*mid==num){
            return true;
        }else if(mid*mid>num){
            right=mid-1;
        }else{
            left=mid+1;
        }
    }
    return false;
};

2.双指针法

双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

  • 暴力解法时间复杂度:O(n^2)
  • 双指针时间复杂度:O(n)

27. 移除元素

在这里插入图片描述
解法借用代码随想录中的图解:
在这里插入图片描述

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function(nums, val) {
    var slowIndex=0;
    var fastIndex=0;
    for(fastIndex;fastIndex<nums.length;fastIndex++){
        if(nums[fastIndex]!=val){
            var temp=nums[fastIndex];
            nums[slowIndex]=temp;
            slowIndex++;
        }
    }
    return slowIndex;
};

26. 删除有序数组中的重复项

在这里插入图片描述
这个题的关键词是升序排列(这个题我老是出错,mark一下~)

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    var slowIndex=0
    var fastIndex=1
    for(fastIndex=0;fastIndex<nums.length;fastIndex++){
        if(nums[slowIndex]!=nums[fastIndex]){
            nums[++slowIndex]=nums[fastIndex]
        }
    }
    return slowIndex+1
};

283.移动零

在这里插入图片描述

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    var fastIndex=0;
    var slowIndex=0;
    for(fastIndex;fastIndex<nums.length;fastIndex++){
        if(nums[fastIndex]!=0){
            nums[slowIndex]=nums[fastIndex];
            slowIndex++;
        }
    }
    for(slowIndex;slowIndex<nums.length;slowIndex++){
        nums[slowIndex]=0;
    }
    return nums;
};

844. 比较含退格的字符串

在这里插入图片描述
写这个题的时候卡了超级久,原因是审题错了,刚开始我一直以为退格的意思就是删掉前面所有的字符,然后重新输入,导致一直通过不了,浪费了大量时间,哎,以后一定要吸取教训,认真看官方给的案例!!!
这里遇到了一个坑,刚开始我写的代码是这样的:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
   function shuangzhizhen(s){
       var slowIndex=0;
       var fastIndex=0;
       for(fastIndex;fastIndex<s.length;fastIndex++){
           if(s[fastIndex]!='#'){
               var temp=s[fastIndex];
               s[slowIndex]=temp;
               slowIndex++;
           }else if(slowIndex!=0){
               slowIndex--;
           }
       }
       s=s.substring(0,slowIndex)
       return s
   }
   s=shuangzhizhen(s);
   t=shuangzhizhen(t);
   return s==t;
};

按理说,逻辑上是没有错误的,但是一直通不过案例,为什么呢?查阅文献,才发现,js代码具有不变性,在 JavaScript 中,字符串 的值是 不可变的,这意味着一旦字符串被创建就不能被改变。比如下面的代码:

	var myStr = "Bob";
	myStr[0] = "J";

是不会把变量myStr的值改变成“Job”的,因为变量myStr是不可变的。
注意,这并不意味着myStr永远不能被改变,只是字符串字面量string literal的各个字符不能被改变。
改变 myStr 中的唯一方法是重新给它赋一个值,我思考了很久,后来还是决定新建一个数组去解决问题:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
   function shuangzhizhen(s){
       var slowIndex=0;
       var fastIndex=0;
       var temp=[];
       var i=0;
       for(fastIndex;fastIndex<s.length;fastIndex++){
           if(s[fastIndex]!='#'){
               temp[slowIndex]=s[fastIndex];
               slowIndex++;
           }else if(slowIndex!=0){
               slowIndex--;
           }
       }     
       return temp.toString().substring(0,slowIndex)
   }
   s=shuangzhizhen(s);
   t=shuangzhizhen(t);
   return s==t;
};

977. 有序数组的平方

在这里插入图片描述
这个题的技巧在于,它是按照非递减顺序排列的,所以平方的最大值应该是在两边出现

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
   var index1=0;
   var index2=nums.length-1;
   var i=nums.length-1;
   var numsResult=[];
   while(index2!=index1){
       if(nums[index1]*nums[index1]>=nums[index2]*nums[index2]){
           numsResult[i]=nums[index1]*nums[index1];
           i--;
           index1++;
       }else{
           numsResult[i]=nums[index2]*nums[index2];
           i--;
           index2--;
       }
   }
   numsResult[i]=nums[index2]*nums[index2];
   return numsResult;
};

3.滑动窗口

209.长度最小的子数组

在这里插入图片描述

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
   var res=nums.length+1;
   var Sum=0;
   var index=0;
   for(var i=0;i<nums.length;i++){
       Sum=Sum+nums[i];
       while(Sum>=target){
           if(res>(i-index+1)){
               res=i-index+1;
           }
           Sum=Sum-nums[index];
           index++;
       }
   }
   if(res>nums.length){
       return 0;
   }else{
       return res;
   }
};

904.水果成篮(努力理解中…)

在这里插入图片描述
这个题还挺复杂┭┮﹏┭┮,刚开始看了好几遍都没看懂,还是看了评论区的答案才知道咋写:

/**
 * @param {number[]} fruits
 * @return {number}
 */
var totalFruit = function(fruits) {
      let l = 0;//起始指针
    let maxLen = 0;//窗口的最大长度 其中最多包涵两种水果
    let n = 0//前一类水果的结束位置
    let arr = [fruits[l]]//水果的种类数组

    for(let r = 0; r < fruits.length; r++){//窗口的右指针不断前进
        if(!arr.includes(fruits[r])){//如果窗口中不包含 进窗口的水果
            if(arr.length <= 1){//如果只有一种水果
                arr[1] = fruits[r]//将这种水果加入arr数组
            }else{//如果有两种水果
                l = n//更新窗口的左边界
                arr[0] = fruits[r-1]//更新arr中水果的种类
                arr[1] = fruits[r]
            }
        }
       
        if(fruits[r] !== fruits[n]){//如果进来了一种新的类型的水果 更新前一种水果的位置
            n = r
        }

        maxLen = Math.max(maxLen,r-l+1)//更新滑动窗口的最大值
    }
    return maxLen
};

这个题其实到现在也还是一知半解的,在努力理解了…

76.最小覆盖子串(未解决)

在这里插入图片描述

这是道hard题,我发现我之前刷题的时候漏掉这道题了,今天整理这个文档花费太多时间了,平时还要应付科研,暂时先放一放,明天或者后天把这个题克服掉,mark一下…

4.模拟行为

54.螺旋矩阵

在这里插入图片描述

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
   var matrix1=new Array(n);
   for(var i=0;i<n;i++){
       matrix1[i]=new Array(n);
   }
   var left=0;
   var right=n-1;
   var top=0;
   var buttom=n-1;
   var num=1;
   while(left<=right&&top<=buttom){
       for(var i=left;i<=right;i++){
           matrix1[top][i]=num;
           num++;
       }
       top++;
       for(var i=top;i<=buttom;i++){
           matrix1[i][right]=num;
           num++;
       }
       right--;
       for(var i=right;i>=left;i--){
           matrix1[buttom][i]=num;
           num++;
       }
       buttom--;
       for(var i=buttom;i>=top;i--){
           matrix1[i][left]=num;
           num++;
       }
       left++;
   }
   return matrix1
};

这个题目难点在于写着写着就不知道逻辑到哪里去了,然后容易出错,其他倒没啥问题。

今天就总结到这里吧,今天总结了一下午加晚上两个小时才总结完,能把算法刷熟练的人都不容易,我平时科研任务比较重,本来学习时间就很短,以后一定要记得一周总结一次,不然真的很累,一次性总结这么多┭┮﹏┭┮

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring 大白话系列:工厂

Spring 大白话系列&#xff1a;工厂 “工厂模式&#xff0c;大家都很熟悉了。说到底&#xff0c;就是解除创建对象和使用对象之间的耦合。这东西没啥啊。” 教室里&#xff0c;老师傅听到小明在嘀嘀咕咕的。老师走过去问&#xff1a; “有什么问题呢小明同学&#xff1f;” 小…

三、Buffer has no PTS和runtime check failed

1 问题来源 1.1 Buffer has no PTS 我使用mp4mux或者qtmux的时候&#xff0c;偶尔会出现Buffer has no PTS问题。 PTS&#xff08;时间戳&#xff09;是用于标识音视频数据在时间轴上的位置的重要参数&#xff0c;缺少时间戳信息会导致无法确定数据在时间轴上的位置&#xf…

Java单元测试浅析(JUnit+Mockito)

Java测试我们应该都遇到过&#xff0c;一般我们会被要求做单元测试&#xff0c;来验证我们代码的功能以及效率。 这里来和大家一起探讨下有关单于测试。 什么是单元测试&#xff1f; 是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义&#xff0c;一般…

C/C++开发,无可避免的内存管理(篇四)-智能指针备选

一、智能指针 采用C/C开发堆内存管理无论是底层开发还是上层应用&#xff0c;无论是开发新手&#xff0c;还是多年的老手&#xff0c;都会不自觉中招&#xff0c;尤其是那些不是自己一手经历的代码&#xff0c;要追溯问题出在哪里更是个麻烦事。C/C程序常常会遇到程序突然退出&…

Idea启动多个SpringBoot项目的3种方案

​ 悟纤&#xff1a;师傅&#xff0c;你最近是哪去了&#xff0c;这上班都快1个月了&#xff0c;都没见你踪影&#xff0c;你这是上哪里去放纵去了吗&#xff1f; 师傅&#xff1a;徒儿&#xff0c;你说的这是啥话&#xff0c;是放松&#xff0c;不是放纵&#xff0c;为师严重…

axicom的测试文档

目录&#xff09;SQLpython开放性业务题&#xff08;二选一&#xff09;完整代码SQL 问题描述 SQL&#xff0c; 请根据前一周各产品的总GMV将其分成五类&#xff1a;GMV Top 20%、20%-40%&#xff0c;40%-60%&#xff0c;60%-80%以及Bottom 20%的产品组&#xff0c;请计算这五…

【Java】创建多线程的四种方式

一、方式1&#xff1a;继承Thread类 步骤&#xff1a; 创建一个继承于Thread类的子类重写Thread类的run()方法 ----> 此线程执行的操作声明在方法体中创建当前Thread子类的对象通过实例对象调用start()方法&#xff0c;启动线程 ----> Java虚拟机会调用run()方法 注意…

QuickHMI Hawk R3 Crack

基于网络的 SCADA / HMI 系统 QuickHMI Hawk R3 QuickHMI是一个 100% 基于网络的SCADA/HMI 系统。 得益于HTML5、SVG和Javascript等现代网络技术&#xff0c;可视化可以在任何当前浏览器和设备中显示。作为浏览器的替代品&#xff0c;可以使用“独立查看器”和移动应用程序。 Q…

react react-redux学习记录

react react-redux学习记录1.原理2.怎么用呢2.1 容器组件2.2UI组件2.3 App.jsx3.简化3.1简写mapDispatch3.2 Provider组件的使用3.3整合UI组件和容器组件1.原理 UI组件:不能使用任何redux的api&#xff0c;只负责页面的呈现、交互等。 容器组件&#xff1a;负责和redux通信&…

Orcad原理图放置辅助线的方法

Orcad原理图放置辅助线的方法 设计当中&#xff0c;可以通过放置辅助线来标识信号方向或者对功能模块进行分块标识。 1&#xff09;执行菜单命令“Place-Line”&#xff08;快捷键“ShiftL”&#xff09;&#xff0c;激活放置状态。 2&#xff09;在一个合适的位置单击鼠标左键…

零基础该如何转行Python工程师?学习路线是什么?

最近1年的主要学习时间&#xff0c;都投资到了 python 数据分析和数据挖掘上面来了&#xff0c;虽然经验并不是十分丰富&#xff0c;但希望也能把自己的经验分享下&#xff0c;最近也好多朋友给我留言&#xff0c;和我聊天&#xff0c;问我python该如何学习&#xff0c;才能少走…

字节前端必会面试题(持续更新中)

事件传播机制&#xff08;事件流&#xff09; 冒泡和捕获 谈一谈HTTP数据传输 大概遇到的情况就分为定长数据 与 不定长数据的处理吧。 定长数据 对于定长的数据包而言&#xff0c;发送端在发送数据的过程中&#xff0c;需要设置Content-Length,来指明发送数据的长度。 当…

前端面试题——性能优化 高频

目录 一、CDN的概念 二、CDN的原理 三、懒加载的实现原理 四、对节流与防抖的理解 五、实现节流函数和防抖函数 六、回流与重绘的概念及触发条件 七、如何避免回流与重绘&#xff1f; 八、如何对项目中的图片进行优化&#xff1f; 九、如何⽤webpack来优化前端性能&…

Python 简单可变、复杂可变、简单不可变、复杂不可变类型的copy、deepcopy的行为

copy模块&#xff1a;copy&#xff1a;浅拷贝deepcopy&#xff1a;深拷贝简单可变类型、复杂可变的copy()、deepcopy()&#xff1a;简单不可变、复杂不可变类型的copy()、deepcopy()&#xff1a;结论&#xff1a;对于简单类型的可变类型copy是深拷贝&#xff0c;改变了该拷贝变…

1.FFmpeg-音视频基础

专栏介绍基于最新的FFmpeg5.1.2版本讲解学习, 跟随博主一起学习ffmpeg: 本专栏学习流程为: FFmpeg安装、

Spring之AOP理解及使用

文章目录AOP是什么AOPSpring的通知类型1.Before通知2. AfterReturning通知3.AfterThrowing通知4. After通知5. Around通知动态代理JDK动态代理CGLib动态代理动态代理的代码展示AOP使用切面类的配置最后大家好&#xff0c;我是Leo&#xff01;今天给大家带来的是关于Spring AOP的…

jsp学生成果管理系Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 学生成果管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

分布式理论-学习笔记

1 分布式概述 分布式系统是计算机程序的集合&#xff0c;这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。可以分为分布式计算、分布式存储、分布式数据库等。 2 系统模型 2.1 故障模型 Byzantine failure:节点可以任意篡改发送给其他节点的数据ADB:Byzantine fa…

Stacked hourglass networks for human pose estimation代码学习

Stacked hourglass networks for human pose estimation https://github.com/princeton-vl/pytorch_stacked_hourglass 这是一个用于人体姿态估计的模型&#xff0c;只能检测单个人 作者通过重复的bottom-up&#xff08;高分辨率->低分辨率&#xff09;和top-down&#xff0…

乐友商城学习笔记(十五)

无状态登陆原理 在服务器端保存session 无状态不需要session&#xff0c;把登陆状态保存在cookie中 jwtrsa token&#xff1a;登陆时&#xff0c; jwt oath2 jwt&#xff1a;头信息&#xff08;jwt&#xff09; 载荷&#xff08;用户信息&#xff0c;签发人&#xff0c;签发时…