找出出现次数大于等于总数一半的数 (O(1)空间 O(n)时间)

来源:互联网 发布:nginx grpc 编辑:程序博客网 时间:2024/05/02 02:53

在不保证存在的情况下,先假设存在,若存在则每次删除两个不同的数字,最后的结果无非是全部删光,或者还剩一个,可以用一个数字个数的计数器模拟这个过程,模拟的复杂度是O(n)的,得到那个数字后,再O(n)扫一遍判断是否出现次数大于等于总数一半即可

class Gift {public:    int getValue(vector<int> gifts, int n) {        // write code here        int cnt = 0, num = 0;        for (int i = 0; i < n; i ++) {            if (cnt == 0) {                num = gifts[i];                cnt ++;                continue;            }            if(num == gifts[i]) {                cnt ++;                }            else {                cnt --;            }        }        int pcnt = 0;        for (int i = 0; i < n; i ++) {            if (gifts[i] == num) {                pcnt ++;            }            if (pcnt >= (n + 1) / 2)                return num;        }        return 0;    }};



0 0
原创粉丝点击