• Leetcode


    剑指offer 面试题29:数组中出现次数超过一半的数字


    提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181                                                

    参与人数:3512  时间限制:1秒  空间限制:32768K

    本题知识点:数组

    题目描述

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

    分析:

    当测试用例出现不到一半的情况,应该输出0。

    方法1:快排,如果出现次数超过一半数目的数存在,则该值一定与中位数相等,将其返回;否则返回0. 快排复杂度为n*log n.

    另外此题据说有O(n)复杂度的算法...

    AC代码:

    #include<cstdio>
    #include<vector>
    #include<algorithm>
    using namespace std;
    class Gift {
    public:
        int getValue(vector<int> gifts, int n) {
    	if(gifts.size()==0 || n<=0) return 0;
    	// if(gifts.size()!=n) return 0;  // 此语句有无,在牛客网oj上均能通过,按道理应加上的...
            sort(gifts.begin(),gifts.end());        
            int countMid=0, res;
            for(int i=0; i<gifts.size();i++)
            {
            	if(gifts[i] >= gifts[n/2]) countMid++;
    		}        
            if(countMid>n/2) res=gifts[n/2];
            else res=0;
            return res;
        }
    };
    // 以下为测试 
    int main()
    {
    	Gift sol;
    	int n1=5;
    	vector<int> gifts1={1,2,3,2,2};
    
    	int res1=sol.getValue(gifts1, n1);
    	printf("%d
    ",res1);		
    
    	return 0;
    }


    腾讯 2015秋招 编程题4:微信红包中个数超过总数一半的红包金额

    题目描述
    春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。

    给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。

    测试样例:
    [1,2,3,2,2],5


    返回:2



    AC代码:

    #include<cstdio>
    #include<vector>
    #include<algorithm>
    using namespace std;
    class Gift {
    public:
        int getValue(vector<int> gifts, int n) {
    	if(gifts.size()==0 || n<=0) return 0;
    	// if(gifts.size()!=n) return 0;  // 此语句有无,在牛客网oj上均能通过,按道理应加上的...
            sort(gifts.begin(),gifts.end());        
            int countMid=0, res;
            for(int i=0; i<gifts.size();i++)
            {
            	if(gifts[i] >= gifts[n/2]) countMid++;
    		}        
            if(countMid>n/2) res=gifts[n/2];
            else res=0;
            return res;
        }
    };
    // 以下为测试 
    int main()
    {
    	Gift sol;
    	int n1=5;
    	vector<int> gifts1={1,2,3,2,2};
    
    	int res1=sol.getValue(gifts1, n1);
    	printf("%d
    ",res1);		
    
    	return 0;
    }

    这道题最优的解法类似于 《编程之美》中"寻找水王"的问题,时间复杂度为O(n),空间复杂度O(1)。


    169. Majority Element(求众数)

    提交网址: https://leetcode.com/problems/majority-element/

    Total Accepted: 113359 Total Submissions: 273577 Difficulty: Easy

    Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

    You may assume that the array is non-empty and the majority element always exist in the array.

    Credits:
    Special thanks to @ts for adding this problem and creating all test cases.


    AC代码:

    class Solution {
    public:
        int majorityElement(vector<int>& numbers) {
            int len=numbers.size();
            if(len==0) return 0;        
            sort(numbers.begin(),numbers.end());        
            int countMid=0, res;
            for(int i=0; i<numbers.size();i++)
            {
                if(numbers[i] == numbers[len/2]) countMid++;
            }        
            if(countMid>len/2) res=numbers[len/2];
            else res=0;
            return res;
        }
    };





  • 相关阅读:
    谈谈C++新标准带来的属性(Attribute)
    金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享
    核桃编程:前端可观测性建设之路
    AI和大数据结合,智能运维平台助力流利说提升核心竞争力
    Python静态类型解析工具简介和实践
    盛京剑客系列24:极简估值教程——题记
    Echarts——关系图(人民的名义为例,简化)源码
    UVA10020(最小区间覆盖)
    LA4636积木艺术
    LA4636积木艺术
  • 原文地址:https://www.cnblogs.com/enjoy233/p/10408801.html
Copyright © 2020-2023  润新知