1. 程式人生 > >JS實現 LeetCode 陣列類演算法(五)

JS實現 LeetCode 陣列類演算法(五)

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;
};