更多算法实现见: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;
};