最近一直看编程之美,想法真的很重要,今天发这篇文章还是有一点不自信,希望碰到志同道合的同学一起讨论下!
本文来自:http://blog.csdn.net/lengzijian/article/details/7842551
题目:
有一个无序、元素个数为2n的正整数数组,要求:如何能吧这个数组分割为元素个数为n的两个数组,并使两个子数组的和最近?
例如有如下数组如图:

第一行:源数组
第二行:目的数组
书中讲了很多方法,这里就不在赘述了,我的方法也很简单,相信很多人也想到了,但是没有办法证明这个方法的可靠性。今天我们主要讲下,该方法的可靠性。
先来说下方法:
1. 首先对无序数组进行排序(时间复杂度nlogn)
2. 从当前源数组中取最大的元素,放置到一个和最小的目的数组中(起初都为0,故可以随意放置),同时这个最大元组从源数组中删除。
3. 重复第2步,直到源数组个数为0
按照如上方法:上题的到的结果为:

左边和为43,右边为44。符合题意。
很多人第一感觉就是,①题目不会这么简单,②这种解法可能会有漏洞,下面对该种解法,做一下个人的理解。
1. 我把这种问题看作是往天平上放筹码,放到最后的要求是天平两端的差异最小;
2. 先把要放的筹码都排好序;
3. 先放置最大筹码到天平的任意一段(起初天平是平衡的);
4. 放置第二块筹码到天平筹码重量轻的一段;
5. 放置第三块筹码到天平筹码轻的一段(一定是和第二块一起)。这时,有两种可能:①:天平没有动,此时应按照规则继续放下一块;②天平平衡有变化(包括两边平衡和逆变化),我们可以确定的是,此时此刻天平两边的筹码重量差一定小于等于刚刚放上的筹码(目前天平上最轻的筹码)
6. 按照上面的方法,放到最后一块后,如果天平平衡是有变化的,我们可以保证天平量变的差值永远小于等于所有筹码最小的一个。当没有变化是,也可以保证我们的结果是正确的(自己考虑下)
目前我能想到的只有这些,根据上面的规则时间复杂度应该为nlogn(排序)+n = O(nlogn)
如果本人哪里说得不对,可以留言,也希望能够遇到一些朋友一起讨论下这方面的问题。
分享到:
相关推荐
### 数组游戏——常用的编程代码总结 #### 一、引言 本文主要介绍了一款基于字符数组的游戏开发过程中的常用编程技巧与代码片段。通过这些技术,可以创建出简单的图形和动画效果,使得游戏更加生动有趣。文章首先...
c语言 c语言编程题之数组操作寻找数组的中心索引
在探讨“1.8编程基础之多维数组_08矩阵加法”这一主题时,我们需要关注多个方面的知识点,包括编程基础、多维数组的定义和使用、矩阵加法的概念以及信息学奥林匹克竞赛(NOIP)的培训课程内容。 首先,我们来了解...
后缀数组在信息学竞赛和实际编程中有着广泛的应用,它简化了许多原本复杂的字符串处理问题,使得算法设计更为简洁高效。通过熟练掌握后缀数组的构建和应用,可以大大提高解决字符串问题的能力。
3)整数之和问题,通过标记找出序列中有哪些数是另外两个数之和。 适用人群:适用于初学者和有一定编程基础的学员,特别是参加NOI系列课程的学生。 使用场景及目标:本文旨在帮助学生掌握数组标记法的基本思想和实现...
北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part3rar,提供“北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part3”免费资料下载,主要包括可编程序控制器的特点与分类、网络型PLC与DCS的关系...
本主题聚焦于“数组操作自除数”的编程题目,这是一个涉及数值运算和数组处理的问题。首先,我们需要理解什么是自除数。 自除数是指一个整数,当它被它的每一位数字去除时,都可以得到整数结果。例如,128是一个自...
Java面试编程题(数组和链表相关) 本资源主要讲解了Java面试编程题中的数组和链表相关知识点,涵盖了Java编程语言中数组和链表的基本概念、算法和数据结构等方面的知识。 一、数组相关知识点 1. 、二维数组的...
本编程题“数组操作高度检查器”旨在考察你对C语言数组操作的理解以及问题解决能力。在这个题目中,你可能需要编写一个程序,该程序能够处理二维数组,模拟一种“高度检查”的过程。 首先,你需要理解二维数组的...
金融数量分析——基于MATLAB编程
接下来,本篇报告将详细解读二维数组和字符数组的实验内容,以期加深对数组应用的理解,并掌握相关编程技能。 首先,让我们回顾一下数组的定义及其基本操作。数组是一组有序的变量集合,它们都拥有相同的数据类型。...
北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part2rar,提供“北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part2”免费资料下载,主要包括可编程序控制器的特点与分类、网络型PLC与DCS的关系...
北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part4rar,提供“北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part4”免费资料下载,主要包括可编程序控制器的特点与分类、网络型PLC与DCS的关系...
本编程练习旨在加深对C语言中二维数组、指针和函数的理解,通过实际操作提升编程技能。下面我们将深入探讨这些知识点。 首先,二维数组在C语言中被声明为`类型名 数组名[行数][列数]`,例如`int arr[3][4]`创建了一...
游戏之旅——我的编程感悟.pdf
在C语言编程中,数组是一种基本的数据结构,用于存储同类型的数据集合。本题目的核心是处理非递减序列,即数组中的元素按照从小到大的顺序排列,不允许有连续的降序。以下将详细讲解与题目相关的C语言知识点,包括...
在给定的编程题目“数组操作最大连续1的个数”中,我们需要找到一个二进制数组(即只包含0和1的数组)中连续1的最大个数。这个问题涉及到数组遍历、条件判断以及计数技巧,是C语言编程中常见的算法问题。下面将详细...
在Python编程语言中,函数是组织良好、可重复使用的代码块,它们允许我们将复杂的问题分解为更小、更易于管理的部分。在这个主题中,我们主要关注如何利用函数处理数组,特别是在大数据分析中的应用。数组分割是数据...
在"种花问题"这个编程实例中,我们很可能会遇到如何利用数组来解决实际问题的情况。C语言中的数组操作是学习编程的重要一环,下面我们将深入探讨这个主题。 首先,数组是由同一类型的元素组成的有序集合,它们在...
在本编程题“公平的糖果交换”中,我们可能需要处理一个整数数组,通过一定的逻辑来解决糖果分配的问题,确保分配是公平的。下面我们将深入探讨C语言中的数组操作以及如何解决这个问题。 首先,理解数组的基本概念...