JS實現 LeetCode 陣列類演算法(五)
阿新 • • 發佈:2019-01-25
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;
};