刷题笔记:数组中出现次数超过一半的数字(C++ && python)

剑指offer刷题笔记

前言:

最近因为毕设的核心算法是用python写的,而考研复试大概率用C++,所以以后刷题会先用C++实现,然后在用python复现一遍,这样可以练习到两种语言

题目描述

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

思路

由题,因为是找出现次数超过数组长度一半的数字,那么这个数字的出现的次数一定是其他数字出现次数之和。因此可以考虑在遍历数组的时候保存两个值:一个是数组中的某个数字,另外一个是这个数字出现的次数。

当我们遍历到下一个数字的时候,如果下一个数字和之前保存的数字相同,则次数加1,不相同则减去1。如果次数为0,那么就需要保存下一个数字,并把次数设为1。

由于要找到的数字出现的次数比其他数字出现的次数之和要多,那么要找的数字肯定是最后一此把次数设为大于0的数组。

但是也有特殊情况,就是没有任何一个数字符合条件,那么最后一个数得到的数字并不是所需要的结果,那么就需要对结果进行检查。

源代码

C++:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty()){
            return 0;
        }
        
        int result = numbers[0];
        int times=1;
        
        //找到出现次数最多的数字
        for(int i=1;i<numbers.size();i++){
            if(times==0){
                result=numbers[i];
                times=1;
            }
            else if(numbers[i]==result)
                times++;
            else
                times--;
        }
        
        times=0;
        
        //判断出现的次数
        for(int i=0;i<numbers.size();i++){
            if(numbers[i]==result)
                times++;
        }
        
        if(times>numbers.size()/2)
            return result;
        else
            return 0;
    }
};

Python:

# -*- coding:utf-8 -*-
class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        result = numbers[0]
        times = 1
        for i in range(1,len(numbers)):
            if times == 0:
                result = numbers[i]
                times = 1
            elif numbers[i]==result:
                times+=1
            else:
                times-=1
                
        times=0
        for i in range(len(numbers)):
            if numbers[i]==result:
                times+=1
        return result if times > len(numbers)//2 else 0
发布了22 篇原创文章 · 获赞 0 · 访问量 587

猜你喜欢

转载自blog.csdn.net/SampsonTse/article/details/103944264
今日推荐