算法--将数组分成和相等的多个子数组,求子数组的最大个数

2023-11-18

作者:陈太汉

一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
  比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
  {3,6}{2,4,3} m=2
  {3,3}{2,4}{6} m=3 所以m的最大值为3

算法 原理的思想是将大问题转换成小问题。
就{3,2,4,3,6}的操作步骤:
      第一步:想将数组递减排序得{6,4,3,3,2},求出数组中所有数的和m=18,第一个最大的数b=6, m/b=3余数为0,
当除数为1,余数为0时终止。当余数不为0时,转到第三步。当余数为0时将数组划分为{6},{4,3,3,2}两个。把{4,3,3,2}看成一个新的数组。
      第二步:先用{4,3,3,2}中的最大数与b=6比较,即4<b,所以再将4与最右边的数即2相加与b比较,
结果相等,则将这两个数从该数组中除去生成新的数组,转到第一步,现在的结果是{6},{4,2},{3,3},把{3,3}看成一个新的数组继续重复第二步。
      第三步,将数组中最大的数与最小的数取出构成一个新数组Z,剩余的构成一个数组,然后,
判断m/Z中数字之和看是否余数为0,若为0,把b替换为Z中数字之和转第二步,若不为0,
继续从剩余的数字中取出最小值加入到Z中,再判断m/Z中数字之和看是否余数为0,直到为0,转第二步为止。
最后得到的结果是{6},{4,2},{3,3} 这时可以计算出m为3,也可以在程序中作记载。
在第二步工程过,若出现两个数相加大于上一次的b,则将程序转到第三步。

上面是别人的分析,我想很多人跟我一样看了相当晕,但看了我的代码你应该不至于晕。有时候用文字表达还真是繁琐,但是代码却简单明了。

大家都说算法和数据结构对程序员来说很重要,还说比的就是这个,我看未必,我觉得更重要的还是分析问题的能力,你要是能把问题分析得相当透彻,我相信你也能写出相应的代码。

很多问题看起来复杂,但是等你分析清楚了,还是相当简单的。这道算法面试题的代码是相当简单啊!

源代码
#include < iostream >
using namespace std ;

class FindMaxM
{
public :
int FindM( int arr[], int length)
{
if (NULL == arr || length <= 0 )
{
return - 1 ;
}

// 倒序排序
InsertSort(arr,length);

int sum = 0 ; // 数组的和
for ( int i = 0 ;i < length;i ++ )
{
sum
+= arr[i];
}

int end = length - 1 ;
int subSum = arr[ 0 ];
while (sum / subSum >= 2 )
{
if (sum % subSum == 0 )
{
return sum / subSum;
}
subSum
+= arr[end -- ];
}

return - 1 ;
}

private :
// 用数组实现插入排序
inline void InsertSort( int arr[], int length)
{
int cur;
for ( int i = 1 ;i < length;i ++ )
{
cur
= arr[i];
for ( int j = 0 ;j < i;j ++ )
{
if (arr[j] < cur)
{
for ( int k = i;k > j;k -- )
{
arr[k]
= arr[k - 1 ];
}
arr[j]
= cur;
break ;
}
}
}
}

// 用指针实现选择排序
inline void SelectSort( int * ptArr, int n)
{
for ( int i = 0 ; i < n - 1 ; i ++ )
{
int k = i;
for ( int j = i + 1 ; j < n; j ++ )
{
if ( * (ptArr + j) >* (ptArr + k))
{
k
= j;
}
}
if (k != i)
{
int tmp = * (ptArr + k);
* (ptArr + k) = * (ptArr + i);
* (ptArr + i) = tmp;
}
}
}

};

排序用了两种方实现。插入排序和选择排序就不多说了,大家都懂。

我要说的是用数组实现排序和用指针实现排序,个人认为指针排序速度要比数组排序快(没有测试),

指针直接访问元素的地址,而数组要先计算元素的偏移,才能得出元素的地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法--将数组分成和相等的多个子数组,求子数组的最大个数 的相关文章

  • java类型转换小细节之BigDecimal转String

    public static void main String args 浮点数的打印 System out println new BigDecimal 10000000000 toString 普通的数字字符串 System out pr
  • linux配置虚拟IP地址方法

    linux配置虚拟IP地址方法 在日常linux管理工作中 需要为应用配置单独的IP地址 以达到主机与应用的分离 在应用切换与迁移过程中可以做到动态切换 特别是在使用HA的时候 这种方案可以保证主机与应用的隔离 对日常的运维有很大的益处 但
  • DDL与DML的区别

    DML Data Manipulation Language 数据操纵语言 适用范围 对数据库中的数据进行一些简单操作 如insert delete update select等 DDL Data Definition Language 数

随机推荐

  • 如何排查 Electron V8 引发的内存 OOM 问题

    经过长达大半年时间的崩溃治理后 基于 Electron 框架开发的新版 PC 淘宝直播推流客户端的稳定性终于赶超基于QT 框架开发的旧版本了 剩下的崩溃问题中有 40 是跟内存 OOM 有关 其中 V8FatalErrorCallback
  • 堆栈常量池

    堆栈常量池详解 例子 转自 http www iteye com topic 634530 一 概述 寄存器 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 栈 stack 存放基本类型的变量数据和对象的引用 但对象本身不存放
  • 在myeclipse拷贝项目时候经常遇到的问题

    我们有事为了省事 在myeclipse中拷贝一个web项目 然后复制下来 改改里面的内容就直接放到tomcat中运行 会发现找不到路径 然而地址栏什么的都正确 这是为什么那 仔细找找你会发现原来是 这个项目的入口没有改 你用的还是上一个项目
  • m3u8视频下载器

    文章目录 前言 一 获取网站的m3u8文件url 二 使用步骤 1 修改配置文件 2 运行py或者exe 总结 前言 有的时候看个视频太卡了 就想把视频搞下来 一些网站吧 它不让下载 而且还是ts流视频 于是就做了个m3u8视频下载器第一版
  • SQL如何分析用户复购?(复购率、表连接)

    题目 表名为 购买记录表 里记录某在线教育平台的用户购买记录 包含字段 用户id 购买时间 课程类型 消费金额 问题 分析出每日首次购买用户的次月 第三月 第四月复购情况如何 解题思路 1 群组分析方法 这类复购问题的取数方式是群组分析方法
  • GAMES101:作业3

    GAMES101 作业3 附其他所有作业超链接如下 Games101 作业0 作业0 Games101 作业1 作业1 Games101 作业2 作业2 Games101 作业3 作业3 Games101 作业4 作业4 Games101
  • python课程预告_2月27日直播课程预告

    明天硬核直播课程的预告 1 10 00 赖晓铮老师的 零代码FPGA图形化编程十日谈 明天讲时序逻辑电路的重要组成部分 计数器 本节需要熟悉基于触发器和组合逻辑的计数器电路模型 还会讲到秒表 电子钟和按键消抖电路的计数器应用示例 以及基于计
  • VS2017卡在登录界面问题

    文章目录 前言 分析 总结 参考链接 前言 之前一直在用VS2017来进行C 开发工作 今天打开软件 提示需要登录才能继续使用 但是在登录时 发现一直卡在登录界面 无法继续 如下图 分析 这里感觉是微软服务器连接不上导致的 所以在网上搜索了
  • 搭建MariaDB Gelera Cluster数据库集群

    基础准备 node1 node2 node3 yum源 三节点 安装并初始化数据库 三节点 配置数据库文件 三节点 node2 3 登录数据库 并赋予root用户远程权限后关闭数据库 三节点 启动数据库集群 验证集群功能 查看到wsrep
  • 适合男生的6个副业项目

    现在社会越来越激烈 大家都想在工作之余挣点外快 甚至实现财务自由 本文就为你们介绍几种适合男生从事的副业项目 1 成为自媒体达人 自媒体运营就是你在社交网络 博客 视频平台等自由发挥创作才华 发布内容 并从中赚钱的副业方式 随着智能手机和网
  • 以太坊geth客户端安装经历,也是艰难的一笔。

    现在开始通过看B站的视频学习以太坊 作为入门你看完基本理论肯定是要自己安装geth客户端的 可我缺出现了一些问题 首先我是liunx系统 通过putty软件连接的阿里云 在上面经行一些基本操作 对liunx指令一窍不通的我也是开始liunx
  • Spark项目实战-集群SSH免密码登录

    首先我们会根据之前的CentOS安装教程再搭建sparkproject2和sparkproject3两台虚拟机机器 然后在这基础上配置三台机器之间的ssh免密码登录 1 在三台机器的 etc hosts文件中 都配置对三台机器的ip hos
  • .NET 页面间传值的几种方法

    1 QueryString 这是最简单的传值方式 但缺点是传的值会显示在浏览器的地址栏中且不能传递对象 只适用于传递简单的且安全性要求不高的数值 传递 location href WebForm2 aspx name yourName 接收
  • 刷脸支付就是个破局的大杀器

    科技推动创新 改变产业链格局 从二维码支付爆发取代刷银行卡支付后 传统银行一直担忧的金融脱媒挑战实际上已是即成现实 尽管从监管层面上 一系列如 断直联 二维码互通 等监管要求 对金融机构有较大利好 但在二维码支付时代 大局已定 缺乏C端运营
  • 腾讯文件和微云服务器,网盘Web客户端对比:腾讯微云支持32GB单文件上传

    网盘Web客户端对比 腾讯微云支持32GB单文件上传 网盘最基本的客户端就是Web客户端 为了让这个最基本的客户端更好用 除了网易网盘以及新浪微盘外 其余几款网盘都有提供浏览器插件的下载 这些插件主要提供三个重要的功能 分别是大文件上传 断
  • matlab GUI窗口最大化,以及控件大小和字体自适应

    1 GUI 窗口最大化 双击除控件外的空白处 视图 属性检查器 resize on即可 设置完这个 当放大的时候 会发现我们控件的位置没有变化 此时我们需要设置一个 工具 GUI选项 调整大小的方式 成比例 2 控件大小和字体自适应 当我们
  • pytorch学习:loss为什么要加item()

    作者 陈诚 链接 https www zhihu com question 67209417 answer 344752405 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 PyTorch 0 4 0版本去
  • C#各种结束进程的方法详细介绍

    转自http www cnblogs com zjoch p 3654940 html Process类的CloseMainWindow Kill Close Process CloseMainWindow是GUI程序的最友好结束方式 从名
  • Activity的IntentFilter匹配规则

    读书笔记 我们知道 启动Activity分为两种方式 显示调用和隐式调用 显示调用需要明确的指定被启动对象的组件信息 包括包名和类名 而隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息 如果不匹配将无法启
  • 算法--将数组分成和相等的多个子数组,求子数组的最大个数

    作者 陈太汉 一个整数数组 长度为n 将其分为m份 使各份的和相等 求m的最大值 比如 3 2 4 3 6 可以分成 3 2 4 3 6 m 1 3 6 2 4 3 m 2 3 3 2 4 6 m 3 所以m的最大值为3 算法 原理的思想是