分治法——找众数

news2024/11/28 15:48:00

分治法——找众数

要求:

寻找整数数组的众数,如果存在多个众数,则返回权值最小的那个


第一步:

要利用分治法找众数,首先就先要使数组有序。这里,我们用C语言库中的qsort进行快排:

qsort(nums, numsSize, sizeof(int), cmp_int);
//nums——给定数组
//numsSize——数组大小
//cmp_int——qsort要用到的函数指针

第二步:

开始编写分治算法,寻找众数。

函数声明:

void Find_Mode(int* nums, int begin, int end)

为了方便,我们先定义两个全局变量mode_countmode_index来记录众数出现的次数和下标

int mode_count = 0;	//记录众数出现的次数
int mode_index = 0;	//记录下标

我们以下面的有序数组为例:

在这里插入图片描述

  • 首先假设众数为数组中间的数,记其下标为mode

    int left = begin;
    int right = end;
    int mode = (right - left) / 2 + left;	//为防止整形移除,故不采用(right + left)/2的写法
    
  • 然后,移动leftright,确定有多少个值为nums[mode]的元素:

    while (left < right && nums[left] != nums[mode])
        left++;
    while 
        (left < right && nums[right] != nums[mode])
        right--;
    
    //这样,值为nums[mode]的元素个数为(right - left + 1)
    

    在这里插入图片描述

  • 当确定好nums[mode]的个数count后,就需要比较[begin, left - 1][right + 1, end]这两个区间的和count的大小

    • 如果[begin, left - 1]区间的大小大于或等于count就说明该区间内可能出现出现次数更多的或者权值更小的众数。因此要继续进行递归分治
    • 对于区间[right + 1, end]同理。
    if (left - begin >= right - left + 1)
        Find_Mode(nums, begin, left - 1);
    
    if (end - right >= right - left + 1)
        Find_Mode(nums, right + 1, end);
    
  • 如果上面两个if语句没有执行,那就说明nums[mode]出现的次数count就是最大的,那就需要和mode_count(众数出现的次数)进行比较

    • 如果count == mode_count。那就比较nums[mode]nums[mode_index]的权值,并将众数更新为权值较小的那个,并更新mode_index
    • 如果count > mode_count。那就直接让众数为nums[mode],更新mode_countmode_index
    • 如果count < mode_cout。就不做任何修改
    //right - left + 1即上文所说的count
    if (mode_count <= right - left + 1)
    {
        //如果二者相等,就取权值较小的
        if (mode_count == right - left + 1)
            mode_index = nums[mode] < nums[mode_index] ? mode : mode_index;
        else
        {
            mode_index = mode;
            mode_count = right - left + 1;
        }
    }
    
  • 函数整体即为:

    int mode_count = 0;	//记录众数出现的次数
    int mode_index = 0;	//记录下标
    
    void Find_Mode(int* nums, int begin, int end)
    {
        int left = begin;
        int right = end;
        int mode = (right - left) / 2 + left;
    
        //移动做右指针,寻找nums[mode](假设的众数)的出现次数
        while (left < right && nums[left] != nums[mode])
            left++;
        while (left < right && nums[right] != nums[mode])
            right--;
        
        //如果左右区间的长度大于或者等于nums[mode](假设的众数)的出现次数
        //那就进行分治递归
        if (left - begin >= right - left + 1)
            Find_Mode(nums, begin, left - 1);
        
        if (end - right >= right - left + 1)
            Find_Mode(nums, right + 1, end);
    
        //更新众数
        if (mode_count <= right - left + 1)
        {
            //如果二者相等,就取权值较小的
            if (mode_count == right - left + 1)
                mode_index = nums[mode] < nums[mode_index] ? mode : mode_index;
            else
            {
                mode_index = mode;
                mode_count = right - left + 1;
            }
        }
    }
    

整体代码:

#include <stdio.h>
#include <stdlib.h>

int mode_count = 0;	//记录众数出现的次数
int mode_index = 0;	//记录下标

void Find_Mode(int* nums, int begin, int end)
{
    int left = begin;
    int right = end;
    int mode = (right - left) / 2 + left;

    //移动做右指针,寻找nums[mode](假设的众数)的出现次数
    while (left < right && nums[left] != nums[mode])
        left++;
    while (left < right && nums[right] != nums[mode])
        right--;
    
    //如果左右区间的长度大于或者等于nums[mode](假设的众数)的出现次数
    //那就进行分治递归
    if (left - begin >= right - left + 1)
        Find_Mode(nums, begin, left - 1);
    if (end - right >= right - left + 1)
        Find_Mode(nums, right + 1, end);

    //更新众数
    if (mode_count <= right - left + 1)
    {
        //如果二者相等,就取权值较小的
        if (mode_count == right - left + 1)
            mode_index = nums[mode] < nums[mode_index] ? mode : mode_index;
        else
        {
            mode_index = mode;
            mode_count = right - left + 1;
        }
    }
}

//qsort需要的函数
int cmp_int(void const* num1, void const* num2)
{
	return *(int*)num1 - *(int*)num2;
}

int main()
{
	int nums[] = { 10, 4, 2, 10, 5, 8, 9, 5, 6, 1, 4, 7, 2, 1, 7, 4, 3, 1, 7, 2 };
	int numsSize = sizeof(nums) / sizeof(int);

	qsort(nums, numsSize, sizeof(int), cmp_int);	//利用快速排序排序数组,是数组升序排列

	Find_Mode(nums, 0, numsSize - 1);	//找众数

	printf("众数为:%d\n", nums[mode_index]);

	return 0;
}

注:本题已通过牛客网[编程题]众数验证正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog HDL语言基础知识

目录 Verilog HDL语言基础知识 6.1.2 Verilog HDL模块的结构 6.1.3 逻辑功能定义 6.2.1 常量 6.3 运算符及表达式 6.4.2 条件语句 Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例6.1 一个8位全加器的 Verilog HDL源代码 module adder8(cout,sum,ina,…

如何用 GPT-4 全模式(All Tools)帮你高效学习和工作?

「十项全能」的 ChatGPT &#xff0c;用起来感受如何&#xff1f; 之前&#xff0c;作为 ChatGPT Plus 用户&#xff0c;如果你集齐下面这五个模式&#xff0c;就会成为别人羡慕的对象。 但现在&#xff0c;人们更加期盼的&#xff0c;是下面这个提示的出现&#xff1a; 这个提…

Python---字符串中的count()方法

count()方法 主要功能&#xff1a;求子串在字符串中出现的次数 count 英 /kaʊnt/ v. &#xff08;按顺序&#xff09;数数&#xff1b;计数&#xff0c;点数目&#xff1b;把……算入&#xff0c;包括&#xff1b;重要&#xff1b;被允许&#xff0c;被接受&#xff1b;…

项目实战:新增@RequestMapping和@GetMapping和@PostMapping三个注解

1、RequestMapping package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited public interface RequestMapping {String value(); }2、PostMapping package com.csdn.mymvc.annotation; im…

Java自学第5课:Java web开发环境概述,更换Eclipse版本

1 Java web开发环境 前面我们讲了java基本开发环境&#xff0c;但最终还是要转到web来的&#xff0c;先看下怎么搭建开发环境。 这个图就是大概讲了下开发和应用环境&#xff0c;其实很简单&#xff0c;对于一台裸机&#xff0c;win7 系统的&#xff0c;首先第1步&#xff0c;…

Makefile初识

目录 0.前期准备0.1、程序编译链接&#xff1a; 1.Makefile基础1.1、认识Makefile1.2、Makefile定义模式&#xff1a;(1) 定义模式&#xff1a;(2) 执行Makefile&#xff1a; 1.3、Makefile的变量(1) 变量定义&#xff1a;(2) **变量的赋值符**:(3) 自动化变量 1.4 伪目标1.5 文…

【C++】特殊类设计+类型转换+IO流

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

【QT5之QFtp模块】编译及使用

下载 传送门&#xff1a;https://github.com/qt/qtftp 或者 git clone https://github.com/qt/qtftp.git 下载ZIP&#xff0c;解压待用。 编辑 使用QtCreator打开qtftp.pro; 修改如下&#xff1a; qtftp.pro中&#xff0c;将第21行注释; src/qftp.pro中&#xff0c;将第4行…

JavaEE-博客系统3(功能设计)

本部分内容为&#xff1a;实现登录功能&#xff1b;强制要求用户登录&#xff1b;实现显示用户信息&#xff1b;退出登录&#xff1b;发布博客 该部分的后端代码如下&#xff1a; Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Ser…

微服务之初始微服务

文章目录 一、服务架构演变1.单体架构2.分布式架构 二、认识微服务三、总结四、微服务技术对比五、SpringCloud注意 一、服务架构演变 1.单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 优点&#xff1a; 架构简单部署成本…

【强化学习】17 ——DDPG(Deep Deterministic Policy Gradient)

文章目录 前言DDPG特点 随机策略与确定性策略DDPG&#xff1a;深度确定性策略梯度伪代码代码实践 前言 之前的章节介绍了基于策略梯度的算法 REINFORCE、Actor-Critic 以及两个改进算法——TRPO 和 PPO。这类算法有一个共同的特点&#xff1a;它们都是在线策略算法&#xff0c…

C++ map 的使用

下面的是关于 map 的介绍。来自 map - C Reference (cplusplus.com) 的翻译&#xff0c;您可以看也可以不看哈&#xff01; map 是关联容器&#xff0c;它按照特定的次序(按照 key 来比较)存储由键值 key 和值 value组合而成的元素。在 map 中&#xff0c;键值 key 通常用于排序…

使用腾讯云轻量服务器安装AList

新人有免费两个月试用轻量服务器&#xff0c;使用云服务器商自带的webshell登录&#xff1b; 我这儿用docker安装Alist&#xff0c;因为服务器没自带docker&#xff0c;所以具体安装docker centos7.0最快速安装docker的方法 通过 Docker 部署 Alist 命令&#xff1a; docke…

多元共进|2023 Google 开发者大会现场全回顾

多元共进&#xff5c;2023 Google 开发者大会现场全回顾 作为 Google I/O Connect 环球之旅的收官之站 五湖四海的开发者在此相聚 共度无数个精彩瞬间 两天时光&#xff0c;现场有哪些闪耀时刻&#xff1f; 快来一起盘点&#xff01; 持续关注大会官网 回看更多大会精彩…

JavaScript_Date对象_实例方法_set类

设置一年后的今天&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</…

win10 + cmake3.17 + vs2017编译osgearth2.7.0遇到的坑

坑1&#xff1a;debug模式下生成osgEarthAnnotation时 错误&#xff1a;xmemory0(881): error C2440: “初始化”: 无法从“std::pair<const _Kty,_Ty>”转换为 to _Objty 出错位置&#xff1a;src/osgEarthFeatures/FeatureSourceIndexNode.cpp 解决办法&#xff1a; …

S4.2.4.7 Start of Data Stream Ordered Set (SDS)

一 本章节主讲知识点 1.1 xxx 1.2 sss 1.3 ddd 二 本章节原文翻译 2.1 SDS 数据流开始有序集 SDS 代表传输的数据类型从有序集转为数据流。它会在 Configuration.Idle&#xff0c;Recovery.Idle 和 Tx 的 L0s.FTS 状态发送。Loopback 模式下&#xff0c;主机允许发送 SDS。…

【项目源码】反编译Java字节码生成源码

【项目源码】反编译Java字节码生成源码 文章目录 【项目源码】反编译Java字节码生成源码参考资料一、什么是反编译&#xff1f;二、反编译Java字节码文件1. &#xff08;不一定有效&#xff09; 使用IDEA提供的插件 - Java Bytecode Decomplier2. &#xff08;推荐&#xff09;…

网络性能瓶颈分析,让我来说给你听!

在性能测试中&#xff0c;谈到网络问题&#xff0c;其实&#xff0c;在没有特别说明的情况下&#xff0c;我们一般讲的都是 HTTP 协议下的网络瓶颈问题&#xff0c;那&#xff0c;对于这个问题&#xff0c;我们如何来分析呢&#xff1f;计算机中的网络&#xff0c;跟我们现实生…

ESP32S3入手体验测试

ESP32S3入手体验测试 &#x1f516;所入手的型号是YD-ESP32-S3 N16R8,该款和乐鑫官方推出的ESP32-S3-DevKitC-1配置差不多。 &#x1f388;乐鑫官方介绍&#xff1a;ESP32-S3-DevKitC-1 v1.1 &#x1f530;两者采用的模组&#xff1a;ESP32-S3-WROOM-1 和ESP32-S3-WROOM-1U模组…