5.17打卡:劍指 offer兩題:數組中出現次數超過一半的數字/連續子數組最大的和

數組中出現次數超過一半的數字

題目描述

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。

思路:藉助哈希表,哈希表的鍵是數字,值是數字出現的次數。整體流程如下:

  • 遍歷數組,統計數字和出現次數
  • 遍歷哈希表,返回出現次數超過長度一半的數字
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        unordered_map<int, int> m;
        int size = numbers.size();
        for(int i = 0; i < size; i ++)
        {
            m[numbers[i]] ++;//統計數組每個值出現的次數
            if(m[numbers[i]] > size / 2) return numbers[i];//超過一半輸出結果
        }
        return 0;
    }
};

連續子數組最大的和

題目描述

HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全爲正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和爲8(從第0個開始,到第3個爲止)。給一個數組,返回它的最大連續子序列的和,你會不會被他忽悠住?(子向量的長度至少是1)

思路:從前往後遍歷,最大的連續子序列的和是由當前元素和之前的最大連續子序列的和疊加在一起形成的。如果之前的最大連續子序列的和大於零,我們可以繼續累加,如果小於零,則需要捨去之前的子序列,重新從當前的數字開始累加。時間複雜度爲O(n)

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int m = array[0];
        int b = 0;
        for (int i = 0; i < array.size(); i ++)
        {
            if(b < 0) b = array[i];
            else b += array[i];//如果小於零,則需要捨去之前的子序列,重新從當前的數字開始累加
            m = max(m,b);//如果之前的最大連續子序列的和大於零,我們可以繼續累加
        }
        return m;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章