【JS】到最近的人的最大距离 #数组 找最大距离

在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的。

返回最大距离

输入:[1,0,0,0,1,0,1] 输出:2 ,解释:最大空座是3,向左边或者右边的人最大距离都是2

输入:[1,0,0,0] 输出:3 ,解释:末位距离首位是3

输入:[0, 0, 0, 1, 0, 0, 0, 0, 1] 输出:3 ,解释:虽然中间有4个空座,但是他们最大的距离是2,而最前面的3个空座距离是3

提示:
1 <= seats.length <= 20000
seats 中只含有 0 和 1,至少有一个 0,且至少有一个 1。



解法一:

思路

找到数组中的最大空座位数量 max,再找到最前和最后的空座数 start , end ,返回最大的值,


var maxDistToClosest = function(seats) {
   let max=0,count=0,start=0,end=0;
    for(let i=0;i<seats.length;i++){
        if(seats[i]==0){
            count+=1
        }else{
            count=0
        }
        if(count>max){
            max=count;
        }
    }
    
    for(var i=0;i<seats.length-1;i++){
        if(seats[i]==1) break;
        start+=1
    }
    for(var i=seats.length-1;i>=0;i--){
        if(seats[i]==1) break;
        end+=1
    }
    end = start>end? start : end;
    // console.log(max,end)

    return (Math.ceil(max/2) > end) ? Math.ceil(max/2) : end
};

79 / 79 个通过测试用例
执行用时:92 ms

解法1.1

把上面的代码优化一下


var maxDistToClosest = function(seats) {
    let max=0,count=0,start=0,end=0,s=1,len=seats.length;
    for(let i=0;i<len;i++){
        if(seats[i]==0){
            count+=1; 
            end+=1
            if(s==1) start+=1
        }else{
            s=0; 
            count=0; 
            end=0
        }


        if(count>max) max=count; 
    }
    end=seats[len-1]==0 ? end:0

    
    return Math.max((Math.ceil(max/2)),end,start) 
};

79 / 79 个通过测试用例
执行用时:72 ms

在这里插入图片描述

<think>我们需要在数组到满足条件下距离目标数字最近的数字。条件可能包括:数组中的数字类型(整数、浮点数)、是否考虑多个最近值、距离的定义(绝对值差最小)等。假设条件:距离定义为绝对差值最小,如果有多个,则都返回(或者根据需求返回第一个?)。但问题没有明确,所以我们可以先考虑返回第一个到的最近值,或者返回所有最近值?这里我们先按照返回第一个最近值来设计,但也可以根据需求调整。然而,问题要求是“满足条件下”,但条件没有具体说明。因此,我们假设条件是指定了一个函数(比如过滤条件)和距离目标数字最近。但问题中并没有给出具体的条件函数,所以我们可以先忽略条件,或者将条件作为可选参数。根据问题,我们可能需要一个函数,它接受一个数组、一个目标数字和一个可选的过滤条件函数。如果没有条件,则考虑整个数组。步骤:1.如果有条件,先过滤数组。2.遍历数组(或使用更高效的方法),计算每个元素与目标数字的绝对差值。3.出最小差值,然后返回第一个(或所有)具有该差值的元素。但是,注意:题目要求是“距离数字最近的数字”,如果多个,我们可能需要返回所有,但问题没有明确。所以我们可以设计两个版本,或者根据要求返回一个数组(可能包含多个)或单个。然而,示例中只要求出一个,所以我们可以先实现返回第一个到的最近值。但为了通用性,我们可以返回所有最近值,然后由调用者决定取第一个还是全部。不过,题目没有明确,我们按照返回所有最近值来设计,因为这样更全面。然后如果需要第一个,调用者可以取第一个。实现:方案1:一次遍历,记录最小差值和结果数组。-初始化最小差值为无穷大,结果数组为空。-遍历每个元素(经过条件过滤的):计算绝对差值如果差值小于当前最小差值,则更新最小差值,并重置结果数组为当前元素(因为到了更小的,之前的都要清除)如果差值等于当前最小差值,则把当前元素加入结果数组-返回结果数组方案2:先到最小差值,然后再遍历一次收集所有等于该差值的元素。这里我们采用方案1,一次遍历。但是注意:如果数组为空,返回空数组。另外,条件函数可选,如果没有条件函数,则使用整个数组。示例:在数组[1,3,5,7,9]中,目标数字4,最近的是3和5(差值都是1)。那么返回[3,5](按照顺序,先3后5)。但是如果我们要求返回第一个最近的,那么应该是3(因为3在5前面)。所以如果要求返回第一个,我们可以取结果数组的第一个元素(即第一个遇到的最小差值的元素)。但是我们的函数返回所有,所以调用者可以自己取[0]。因此,我们写一个函数:函数名:findClosestNumbers(arr, target, conditionFunc)其中conditionFunc是一个可选参数,用于过滤数组元素。如果conditionFunc存在,则只有满足条件的元素才被考虑。但是,题目没有要求条件,所以我们也可以不写条件,但为了扩展性,我们加上。由于题目要求是js,我们写js函数。注意:如果数组为空,返回空数组。代码实现:</think>### 在 JavaScript 中查满足条件下距离目标值最近的数字 要实现这个功能,需要: 1. **过滤数组**:先筛选出满足条件的元素 2. **计算距离**:计算每个元素与目标数字的绝对差值 3. **出最小值**:到最小差值对应的元素 ```javascript /** * 查满足条件下距离目标值最近的数字 * @param {Array} arr - 要搜索的数组 * @param {number} target - 目标数字 * @param {Function} condition - 条件过滤函数 * @returns {number|null} 符合条件的最近数字(如无结果返回null) */ function findClosestWithCondition(arr, target, condition) { // 1. 应用条件过滤 const filtered = arr.filter(condition); if (filtered.length === 0) return null; // 2. 计算距离出最小值 let minDiff = Infinity; let closest = null; filtered.forEach(num => { const diff = Math.abs(num - target); if (diff < minDiff) { minDiff = diff; closest = num; } }); return closest; } // 使用示例 const numbers = [1, 5, 8, 12, 15, 20]; const isEven = num => num % 2 === 0; // 条件:只考虑偶数 console.log(findClosestWithCondition(numbers, 10, isEven)); // 输出: 8(距离10最近的偶数) console.log(findClosestWithCondition(numbers, 14, isEven)); // 输出: 12 ``` #### 关键点说明: 1. **条件过滤**:`condition` 函数自定义筛选逻辑(如偶数、质数等) 2. **距离计算**:使用 `Math.abs()` 确保距离为正值 3. **边界处理**:空数组返回 `null` 4. **性能优化**:O(n) 时间复杂度,单次遍历完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值