高频数组算法

news2024/11/20 16:28:28

1.二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9     
输出: 4       
解释: 9 出现在 nums 中并且下标为 4     

使用普通的遍历

var search = function(nums, target) {
for(var i=0;i<nums.length;i++){
    if(nums[i]==target){
        return i
    }
}
return -1

};

使用二分查找

// 二分查找
    var serach = function (nums, target) {
      let left = 0;
      let right = nums.length;
      let mid = Math.ceil((left + right) / 2);
      console.log(mid);
      while (left < right) {
        if (nums[mid] > target) {
          right = mid - 1;
        } else if (nums[mid] < target) {
          left = mid + 1;
        } else {
          return mid;
        }
      }
      return -1;
    };
    serach(nums, target);
    console.log(serach(nums, target));

2.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

方法一:使用新的数组来存储

  var nums = [2, 3, 4, 2];
    var val = 2;
    // 移除元素
    var dele = function (nums, val) {
      let arr = [];
      for (let i = 0; i < nums.length; i++) {
        if (nums[i] !== val) {
          arr.push(nums[i]);
        }
      }
      return arr.length;
    };
    console.log(dele(nums, val));

方法二:双重循环

 // 方法二:双重遍历
    var dele = function (nums, val) {
      for (let i = 0; i < nums.length; i++) {
        if (nums[i] == val) {
          //发现需要移除的元素,就将数组集体向前移动一位
          //num[0]=2
          for (let j = i + 1; j < nums.length; j++) {
            nums[j - 1] = nums[j]; //nums[0]=3,nums[1]=4,nums[2]=2
          }
          i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
          nums.length--; // 此时数组的大小-1
        }
      }
      return nums.length;
    };
    console.log(dele(nums, val));

 3.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]

暴力排序

最直观的想法,莫过于:每个数平方之后,排个序

 var nums = [2, 3, 4];
    var sortarr = function (nums) {
      let arr = [];
      for (let i = 0; i < nums.length; i++) {
        arr.push(nums[i] * nums[i]);
      }
      arr.sort((a, b) => {
        return a - b;
      });
      return arr;
    };
    console.log(sortarr(nums));

双指针法

数组其实是有序的, 只不过负数平方之后可能成为最大数了。

那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

 var sortarr = function (nums) {
      let n = nums.length;
 //创建一个数组并填充对应的数 [0, 0, 0, 0, 0, 0, 0, 0]
      let temp = new Array(n).fill(0);
      let left = 0;
      let right = n - 1;
      let k = n - 1;
      while (left <= right) {
        if (nums[left] * nums[left] > nums[right] * nums[right]) {
          temp[k] = nums[left] * nums[left];
          k--;
          left++;
        } else {
          temp[k] = nums[right] * nums[right];

          k--;
          right--;
        }
      }
      return temp;
    };
    console.log(sortarr(nums));

4.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] 并返回其长度。如果不存在符合条件的子数组,返回 0 。

方法一:暴力解法

时间复杂度: O (n2) 空间复杂度 :O(1)
思路:用i 和 j 表示子数组的头序号和尾序号,
           用rl表示最小连续子数组长度,初始值为原数组长度
          sum储存子数组内数组和
          sumlength子数组长度

 var nums = [2, 3, 1, 2, 4, 3];
    var target = 7;
    var minarr = function (nums, target) {
      let r = 0;
      let l = 0;
      let sumlength = nums.length;
      let sum;
      let rl = 0;
      for (let i = 0; i < nums.length; i++) {
        sum = 0; //初始化,开始踢掉头一个数,重新找最小子数组
        for (let j = i; j < nums.length; j++) {
          sum += sum[j];
          rl = j - i + 1;
          if (sum >= target) {
            sumlength = sumlength > rl ? rl : sumlength;
          }
        }
      }
      return sumlength > rl ? 0 : sumlength;
    };

方法二:双指针法

 var minarr = function (nums, target) {
      let r = 0;
      let l = 0;
      let sumlength = nums.length;
      let sum = 0;
      let rl = 0;
      // 遍历整个数组
      while (r < nums.length) {
        sum += nums[r++]; //小于目标值,移动指针,累加sum

        while (sum >= target) {
          rl = r - l; // r-l就是队列中元素的长度
          sumlength = sumlength > rl ? rl : sumlength;
          sum -= nums[l++]; // 用l指针控制弹出队头的元素
        }
      }
      return sumlength > rl ? 0 : sumlength;
    };

    console.log(minarr(nums, target));

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

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

相关文章

程序员的职业生涯个人规划(附上学习资料)

目录 前言 1.程序员的规划 2.程序员的进化路径 3.IT行业的难度 4.你的选择 5.再谈谈资本、工具人和内卷 总结&#xff1a; 前言 今天不讲技术也不讲干货&#xff0c;来聊一聊程序员职业生涯的个人规划。希望对不管是想入门的还是已经在这条路上的朋友能有一个帮助。 1.程…

opencv之直方图绘制及均衡化

直方图均衡化优势&#xff1a;增强图像对比度&#xff0c;使对比度较低的局部区域获得高对比度。当图像非常暗或者非常亮&#xff0c;并且背景和前景之间的差异非常小时&#xff0c;此方法非常有效&#xff0c;能够解决暴露过度或暴露不足的问题。直方图均衡化缺陷&#xff1a;…

多彩的书写工具,画图写字更好看,米家液晶小黑板多彩版上手

平时临时记些信息&#xff0c;或者是教小朋友认字的时候&#xff0c;液晶小黑板都是特别实用的工具&#xff0c;我之前就用过米家液晶小黑板&#xff0c;最近我发现米家新出了一款彩色笔迹的小黑板&#xff0c;书写效果更加好看&#xff0c;比以前单色款的更好用。 这款米家液晶…

【技术分享】MA21日均线交易策略

文章目录1.前言1.1.相关术语1.2.MA均线系统设置分类1.3.斐波那契数列2.MA21日均线2.1.MA21日均线2.2.MA21日均线交易策略2.3.MA21日均线案例分析1.前言 1.1.相关术语 空头市场&#xff08;Bear Market&#xff09;&#xff1a;亦称熊市&#xff0c;指价格长期呈 下跌 趋势的证…

操作系统权限提升(十)之系统错误配置-计划任务提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

VUE3.0学习

一、父子传值 父组件向子组件传值和vue2.0相比区别不大&#xff0c;区别在于api的使用&#xff0c;让接收参数的写法多样化。父组件::::: <template><div class"about"><div><main><TheWelcome :info"parMsg"/></main>…

【react】理解Fiber

FiberFiber概念结构Fiber 树的遍历是这样发生的【深度遍历】。window.requestIdleCallback()requestAnimationFrameFiber 是如何工作的结论有react fiber&#xff0c;为什么不需要vue fiberFiber 概念 JavaScript引擎和页面渲染引擎两个线程是互斥的&#xff0c;当其中一个线…

12月 被大厂以“人员优化”的名义 无情的辞退了...

前几天&#xff0c;一个认识了好几年在大厂工作的测试员朋友&#xff0c;年近30了&#xff0c;却被大厂以“人员优化”的名义无情被辞&#xff0c;据他说&#xff0c;有一个月散伙饭都吃了好几顿…… 在很多企业&#xff0c;都有KPI考核&#xff0c;然后在此基础上还会弄个“…

IB EE 学习干货,从选学科/课题/写稿/对稿/交稿几个方面入手分享

本文从选学科&#xff0c;选课题&#xff0c;写稿&#xff0c;对稿&#xff0c;交稿几个方面入手分享。关于不同学科的EE&#xff0c;本文涵盖了数学和物理EE&#xff08;因为我们猜很多同学们都选了这两个学科的EE&#xff09;。 文中分享的学习方法都是我们从个人经历出发&am…

微服务 @SentinelResource 服务网关

微服务 SentinelResource 服务网关SentinelResourceFeign整合Sentinel什么场景下需要Feign集合Sentinel呢&#xff1f;服务网关为什么需要网关网关组件Gateway快速入门什么是Gateway操作示例自定义路由规则SentinelResource 自定义异常返回是对所有的情况进行统一处理&#xf…

DTC补货实战:从算法到落地

本文作者&#xff1a;凡飞&#xff0c;从快递到快消&#xff0c;一个平凡的供应链算法深耕者。“ 我希望衡量我们ai团队价值的&#xff0c;不是创造了多么精深的算法&#xff0c;而是跨越算法到落地间距离的能力。”近年来随着电商行业从增量市场逐步成长到了存量市场&#xff…

第二章.神经网络—激活函数

第二章.神经网络 感知机存在如何设置合适的权重问题&#xff0c;神经网络的出现就是为了解决感知机存在的问题&#xff0c;神经网络的一个重要性质&#xff1a;它可以自动的从数据中学习到合适的权重参数。 2.1.从感知机到神经网络 1.神经网络示例 1).示意图&#xff1a; 网络…

《技术领导力:程序员如何才能带团队》 读书笔记

技术管理工作 管理者能力 作为技术团队管理者&#xff0c;无论具体管几个人&#xff0c;最好能够拥有以下能力&#xff0c;才能满足各个需求方提出的需求&#xff1a; 深入理解一门或多门编程语言深入理解多种流行的框架系统架构能力强&#xff0c;拥有复杂系统的设计经验积…

Hystrix高可用框架

Hystrix是什么 Hystrix Home,Hystrix是高可用性保障的一个框架。Netflix的API团队从2011年开始做一些提升系统可用性和稳定性的工作,Hystrix就是从那时候开始发展的。在2012年的时候,Hystrix就变得比较成熟和稳定了,Netflix中除了API团队以外,很多其他的团队都开始使用Hy…

vue2.6.10+vite2开启template模板动态编译

在从vue-cli迁移到vite2的时候&#xff0c;之前在代码中使用的模板编译遇到了问题&#xff1a;我在项目中会根据后台返回的内容动态渲染&#xff0c;如果返回内容中有<el-image>等标签&#xff0c;v-html无法识别非html标签&#xff0c;导致图片渲染失败&#xff0c;因此…

基于Springboot搭建java项目(三十二)—— Docker部署java服务

Docker部署java服务 一、Linux服务安装Docker 关于Docker的安装在之前的Linux的三种安装方式的第三种安装方式中有介绍 传送门&#xff1a;https://blog.csdn.net/m0_46616045/article/details/128841396 二、编写DockerFile 1、将需要部署的Jar包放到服务器上 2、编写Doc…

3.【SpringBoot源码】SpringBoot自动配置原理

目录 一、简介 1)、SpringBootConfiguration 2)、ComponentScan 3)、EnableAutoConfiguration 二、AutoConfigurationPackage 三、Import(AutoConfigurationImportSelector.class) 1)、AutoConfigurationImportSelector介绍 2)、自动配置流程 2-1)、ConfigurationClas…

Vue中数组的列表渲染(v-for渲染数组,数组改变,页面不渲染问题)

1.基本的列表&#xff08;v-for的基本使用&#xff09;&#xff1a; <template><!-- v-for指令:1.用于展示列表数据2.语法&#xff1a;v-for"(item, index) in xxx" :key"yyy"3.可遍历&#xff1a;数组、对象、字符串&#xff08;用的很少&#…

计算机网络基础学习指南(二)

4. HTTP协议 简介 5. Socket 5.1 简介 即套接字&#xff0c;是应用层 与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;表现为一个封装了 TCP / IP协议族 的编程接口&#xff08;API&#xff09; Socket不是一种协议&#xff0c;而是一个编程调用接口&#xff08;API&#…

HashMap源码详细解析

HashMap的继承:HashMap实现了Cloneable接口&#xff0c;所以可以被克隆HashMap实现了Serializable接口&#xff0c;可以被序列化HashMap继承了AbstractMap并实现了Map接口&#xff0c;具有Map接口的所有功能存储结构:JDK1.7(包括1.7)之前HashMap底层是数组链表结合而成的高级数…