尋找陣列的中心索引

世態炎涼!!發表於2020-10-16

平時寫專案時,碰到演算法相關問題,都要思考許久,所以從現在開始堅持學習演算法,從易到難!主要目的學習演算法的思路!今天看下怎麼尋找一個陣列的中心索引,看下面示例
示例 1:

輸入:
nums = [1, 7, 3, 6, 5, 6]
輸出:3
解釋:
索引 3 (nums[3] = 6) 的左側數之和 (1 + 7 + 3 = 11),與右側數之和 (5 + 6 = 11) 相等。
同時, 3 也是第一個符合要求的中心索引。

示例 2:

輸入:
nums = [1, 2, 3]
輸出:-1
解釋:
陣列中不存在滿足此條件的中心索引。

在這裡插入圖片描述
我以為只能從排除第一項和最後項的位置去找中心索引位置,看到上面的結果我錯了,中心索引位置也可以是第一項和最後項!所以我的思路(還是很繁瑣),一開始在陣列的頭和尾加上兩個0,然後排除空陣列的情況(只有我加的2個0),然後一個從左邊開始算,一個從右邊開始算,左邊等於右邊輸出索引!

/**
 * @param {number[]} nums
 * @return {number}
 */
var pivotIndex = function(nums) {
    let left = right = 0;
    nums.push(left);
    nums.unshift(right);
    if (nums.length == 2) {
        return -1;
    };
    for (let i = 0; i < nums.length - 2; i++) {
        left = nums[i] + left;
        for (let k = nums.length - 1; k > i + 1; k--) {
            right = nums[k] + right;
        }
        if (left == right) {
            return i;
        } else {
            right = 0;
        }
    }
    return -1;
};

這個方法畢竟還是很複雜,多次判斷和多次迴圈!然後再想了下別的方法!假如一個陣列arr,leftNumber+leftNumber+arr[i]=arr總和,思路是陣列左邊+陣列右邊+中間索引位置的值 =陣列總和!這個方法程式碼量也很少!判斷也少!

/**
 * @param {number[]} nums
 * @return {number}
 */
var pivotIndex = function(nums) {
    let totolNumber = nums.reduce(function (a, b) {
        return a + b;
    }, 0);
    let leftNumber = 0;
    for (var i = 0; i < nums.length; i++) {
        if (totolNumber - nums[i] === 2 * leftNumber) {
            return i;
        }
        leftNumber += nums[i];
    }
    return -1;
};

相關文章