当前位置: 首页 > Web前端 > JavaScript

【算法】数组

时间:2023-03-27 16:36:25 JavaScript

数组双指针双指针是一种常用的解题思路。可以用两个方向相反或方向相同的指针扫描数组来解决问题。值得注意的是,本书在各个章节中都提到了双指针。本书中的“指针”并不是特指C语言中的指针,而是一个比较宽泛的概念,是在数据容器中定位某个数据的一种手段。在数组中它实际上是一个数字的下标。反向指针面试题6:排序数组中两个数之和题目:输入一个升序排列的数组和一个值k,如何在数组中找出和为k的两个数并返回它们的下标?假设数组中只有一对符合条件的数,一个数不能使用两次。例如输入数组[1,2,4,6,10],k的值为8,数组中数字2和6的和为8,它们的下标分别为1和3。/***@param{number[]}numbers*@param{number}target*@return{number[]}*/vartwoSum=function(numbers,target){letl=0letr=numbers.length-1while(ltarget){r--}else{l++}}};没什么好说的,相反指针的经典题目:2个数之和,特征明显的有序数组。面试题7:数组中3个数之和为0题目:输入一个数组,如何找出数组中所有3个数之和为0的三元组?需要注意的是返回值不能包含重复的三元组。例如数组[-1,0,1,2,-1,-4]中有两个和为0的三元组,分别是[-1,0,1]和[-1,-1,2]./***@param{number[]}nums*@return{number[][]}*/varthreeSum=function(nums){nums.sort((a,b)=>a-b);letres=[]for(leti=0;i0&&nums[i]==nums[i-1])continueletl=i+1;letr=nums.length-1while(l0){r--}else{l++}}}returnres};面试题8:和大于等于k的最短子数组。问题:输入一个由正整数和一个正整数k组成的数组。数组中和大于等于k的连续子数组的最短长度是多少?如果不存在所有数字之和大于或等于k??的子数组,则返回0。例如输入数组为[5,1,4,3],k的值为7,大于等于7的最短连续子数组为[4,3],则输出其长度2。特征:子数组?/***@param{number}target*@param{number[]}nums*@return{number}*/varminSubArrayLen=function(target,nums){让sum=0让l=0让min=Infinityfor(让r=0;r=target){//归约sun,如果满足归约就移动lif(sum-nums[l]>=target){sum-=nums[l]l++}else{//如果不满足,记录并比较最小值,跳出缩减循环min=Math.min(min,r-l+1)break}}}if(min===Infinity)return0返回分钟};快慢指针累加数组数求子数组k之和,数组中和等于k的连续子数组有多少个?比如输入数组[1,1,1],k的值为2,连续2个子数组之和等于2。/***@param{number[]}nums*@param{number}k*@return{number}*/varsubarraySum=function(nums,k){letmap={}letsum=0letcount=0map[0]=1for(letnumofnums){sum+=numcount+=map[sum-k]==undefined?0:map[sum-k]if(map[sum]==undefined){map[sum]=1}else{map[sum]=map[sum]+1}}returncount};面试题11:0和1个数相同的子数组请输入一个只包含0和1的数组如何求0和1个数相同的最长连续子数组的长度?例如数组[0,1,0]中有两个包含相同数量的0和1的子数组,即[0,1]和[1,0],它们的长度都是2,所以输出2.varfindMaxLength=function(nums){让maxLength=0;constmap=newMap();让计数器=0;map.set(计数器,-1);constn=nums.length;for(leti=0;isum+=i);让count=0for(leti=0;i