JS实现 LeetCode 数组类算法(五)

更多算法实现见:https://github.com/Erindcl/Daily-algorithm

628. 三个数的最大乘积

  • 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

分析:因为有负数的出现 有两种结果构成最大乘数,一是三个最大正数相乘,二是一个最大正数和两个最小负数相乘。故将数组排序后 将上述两种情况都进行计算 比较两者结果大小就可求出最大值。代码如下:

var maximumProduct = function(nums) {
    let len = nums.length;
    nums.sort((a, b) => {return b - a;});
    let max1 = nums[0] * nums[1] * nums[2];
    let max2 = nums[0] * nums[len-1] * nums[len-2];
    return max1 >= max2 ? max1 : max2;
};

643. 子数组最大平均数 I

  • 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。

代码如下:

var findMaxAverage = function(nums, k) {
    var sum = 0, max = 0;
    for(var i = 0; i < k; i++){
        sum += nums[i];
    }
    max = sum;
    for(var i = k, len = nums.length; i < len; i++){
        sum += nums[i] - nums[i-k]; // 使用第i个去取代第i-k个元素 只用将两者的差值加入到和中
        max = Math.max(max,sum);
    }
    return max/k;
};

665. 非递减数列

  • 给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。
  • 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。

分析:当判断数组相邻两个数的大小出现前者大于后者的情况时,需考虑此时我们需要改变的是前者的值还是后者的值,所以此刻应该判断前前者与后者之间的大小,如果前前者大于后者则需要改变的是后者 否则需改变前者。代码如下:

var checkPossibility = function(nums) {
    let count = 0;
    for (let i = 1; i < nums.length && count < 2; i++) {  
        if (nums[i] >= nums[i - 1]) {
            continue;
        }
        count++;  
        if (i - 2 >= 0 && nums[i - 2] > nums[i]) {
            nums[i] = nums[i - 1];
        } else {
            nums[i - 1] = nums[i];
        }
    }  
    return count <= 1;  
};

717. 1比特与2比特字符

  • 有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。
  • 现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。

代码如下:

var isOneBitCharacter = function(bits) {
    var len = bits.length, i = 0; 
    while(i < len - 1) {
        i += bits[i] + 1;  // bits[i]为1时,i=i+2;bits[i]为0时,i=i+1
    }
    return i == len - 1
};

674. 最长连续递增序列

  • 给定一个未经排序的整数数组,找到最长且连续的的递增序列。

代码如下:

var findLengthOfLCIS = function(nums) {
    if (nums.length == 0) {
        return 0;
    }
    let maxL = 1, count = 1;
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] <= nums[i-1]) {
            maxL = maxL > count ? maxL : count;
            count = 1;
        } else {
            count++;
        }
    }
    maxL = maxL > count ? maxL : count;
    return maxL;
};

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值