学习算法1 代码层面解析 循环边界

124 阅读1分钟

1、冒泡排序

var sortArray1 = function(nums) {
    // 外层循环 需要多少次的冒泡 nums.length-1
    // 因为第一次冒泡可以把最大的数排好,放在最后(最前),
    // 第二次可以把第二大的数排好
    // 依此类推,当倒数第二个数排好时,整个数组已经排序完成
    for(let i=0;i<nums.length-1;i++){
        // 内层循环 具体的冒泡执行 需要多少次 依此减少
        // 第一次需要将最大的数放在最后,需要nums.length-1次
        // 第二次需要将第二大的数放在倒数第二个位置,需要nums.length-2次
        // 依次类推,知道只剩一个数的时候就不用循环了
        for (let j = 0; j < nums.length-i-1; j++) {
            // 此处的逻辑和i无关
            // 比较第j个数和j+1个数,交换
            if(nums[j]>nums[j+1]){
                // 可以使用解构赋值省去中间变量
                [nums[j],nums[j+1]]=[nums[j+1],nums[j]];
            }
        }
    }
    return nums;
};

2、快速排序 递归

var sortArray = function(nums){
    // 递归后 中止条件
    if(nums.length<=1){
        return nums
    }
    // 取出第一项 也可以时其他项
    let cur =nums[0];
    let left=[];
    let right =[];
    // 循环剩下的项 和第一项比价 小的放left 大的放right
    for(let i=1;i<nums.length;i++){
        if(nums[i]>=cur){
            right.push(nums[i])
        }else{
            left.push(nums[i])
        }
    }
    // 递归排列left和right 知道每一项都只有一个元素 连接数组
    return sortArray(left).concat([cur]).concat(sortArray(right))

} 

3、leetcode 11 盛最多水的容器

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    // 求组成所有的“桶”的面积,
    // 在寻找的过程中发现比存储的面积大,则替换现在存的
    let max=0;
    // 外层循环 所有组成桶的“左边” 共 height.length-1条
    for (let i = 0; i < height.length-1; i++) {
        // 内层循环 所有组成桶的“右边” 随着i的变化 逐渐变小
        // 开始时为i+i,结束比i的边界多1,为height.length
        for (let j = 1+i; j < height.length; j++) {
            // 取“桶”高的最小值
            const small = Math.min(height[i],height[j]);
            // 桶的底为j-i
            if(small*(j-i)>max){
                max=small*(j-i);
            } 
        }
    }
    return max;
};