数组算法总结一(JavaScript版)

本文展示了使用JavaScript实现的几个经典算法,包括二分查找法寻找目标值,移除数组中特定值的元素,计算有序数组的平方并保持顺序,找到数组中长度最小的连续子数组以满足给定条件,以及生成螺旋矩阵的方法。这些算法主要运用了双指针技巧。
摘要由CSDN通过智能技术生成

704.二分查找

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let left = 0, right = nums.length - 1
    while (left <= right) {
        const mid = Math.floor((left + right) / 2)
        if (target < nums[mid]) {
            right = mid - 1
        } else if (target > nums[mid]) {
            left = mid + 1 
        } else {
            return mid
        }
    }
    return -1 // 若找不到则返回-1
};

27.移除元素

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function (nums, val) {
    // 快慢指针
    let fast = 0, slow = 0
    for (; fast < nums.length; fast++) {
        if (nums[fast] !== val) {
            nums[slow++] = nums[fast]
        }
    }
    return slow
};

977.有序数组的平方

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function (nums) {
    // 双指针
    let left = 0, right = nums.length - 1
    const res = []
    while (left <= right) {
        const leftMulti = nums[left] * nums[left]
        const rightMulti = nums[right] * nums[right]
        if (leftMulti > rightMulti) {
            res.push(leftMulti)
            left++
        } else {
            res.push(rightMulti)
            right--
        }
    }
    // 从大到小 -> 从小到大
    return res.reverse()
};

209.长度最小的子数组

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function (target, nums) {
    let res = Infinity
    // 双指针
    let start = 0, end = 0
    let sum = 0
    for (; end < nums.length; end++) {
        sum += nums[end]
        while (sum >= target) {
            res = Math.min(res, end - start + 1)
            sum -= nums[start++]
        }
    }
    return res === Infinity ? 0 : res // 若没有满足条件的则返回-1
};

59.螺旋矩阵

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function (n) {
    // 螺旋矩阵有统一写法,无论是正方形还是长方形,均可如下处理边界
    let left = 0, right = n - 1, top = 0, bottom = n - 1
    let cnt = 1 // 计数器
    // 创建二维数组
    const res = []
    for (let i = 0; i < n; i++) {
        res[i] = []
    }
    // 遍历
    while (left <= right && top <= bottom) {
        for (let i = left; i <= right; i++) {
            res[top][i] = cnt++
        }
        for (let i = top + 1; i <= bottom; i++) {
            res[i][right] = cnt++
        }
        if (left < right && top < bottom) {

            for (let i = right - 1; i > left; i--) {
                res[bottom][i] = cnt++
            }
            for (let i = bottom; i > top; i--) {
                res[i][left] = cnt++
            }
        }
        left++
        top++
        right--
        bottom--
    }
    return res
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值