`

《编程之美》数组分割问题——个人想法和证明

阅读更多

最近一直看编程之美,想法真的很重要,今天发这篇文章还是有一点不自信,希望碰到志同道合的同学一起讨论下!

 

本文来自: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)

 

如果本人哪里说得不对,可以留言,也希望能够遇到一些朋友一起讨论下这方面的问题。

 

 

 

 

 

分享到:
评论

相关推荐

    Java基础练习之数组的应用——ATM Demo

    在这个"Java基础练习之数组的应用——ATM Demo"项目中,我们将会深入探讨如何利用数组和方法来实现一个简单的自动取款机(ATM)模拟程序。这个练习旨在帮助初学者巩固Java基础知识,特别是对数组的操作和方法的使用...

    数组游戏——常用的编程代码总结

    ### 数组游戏——常用的编程代码总结 #### 一、引言 本文主要介绍了一款基于字符数组的游戏开发过程中的常用编程技巧与代码片段。通过这些技术,可以创建出简单的图形和动画效果,使得游戏更加生动有趣。文章首先...

    11.罗穗骞《后缀数组——处理字符串的有力工具》.zip

    后缀数组是字符串处理中的一个重要概念,它在解决与字符串相关的问题时...通过阅读和实践这些内容,读者不仅可以掌握后缀数组的基本概念,还能深入理解其在解决实际问题中的作用,从而提升自己的算法设计和编程能力。

    北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part3.rar

    北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part3rar,提供“北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part3”免费资料下载,主要包括可编程序控制器的特点与分类、网络型PLC与DCS的关系...

    java面试编程题(数组和链表相关) 数组和链表.pdf

    Java面试编程题(数组和链表相关) 本资源主要讲解了Java面试编程题中的数组和链表相关知识点,涵盖了Java编程语言中数组和链表的基本概念、算法和数据结构等方面的知识。 一、数组相关知识点 1. 、二维数组的...

    1.6编程基础之一维数组(10题)--题目 有链接.pdf

    在上述文件中,我们看到了与编程基础相关的一些题目,它们涉及到了一维数组的基本操作和应用。接下来,我将详细解读文件中提及的各个知识点。 1. 与指定数字相同的数的个数 这个题目要求编写一个程序来计算在给定的...

    1.6 编程基础之一维数组 python版.zip

    标题中的“1.6 编程基础之一维数组 python版.zip”表明这是一个关于Python编程的基础教程,特别聚焦在使用Python处理一维数组的概念和实践。一维数组在Python中通常表现为列表(list),是编程中常见且基础的数据...

    北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part2.rar

    北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part2rar,提供“北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part2”免费资料下载,主要包括可编程序控制器的特点与分类、网络型PLC与DCS的关系...

    北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part4.rar

    北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part4rar,提供“北京科技大学_可编程控制器_PLC_——西门子S7300_第一章_.part4”免费资料下载,主要包括可编程序控制器的特点与分类、网络型PLC与DCS的关系...

    C语言二维数组编程练习

    本编程练习旨在加深对C语言中二维数组、指针和函数的理解,通过实际操作提升编程技能。下面我们将深入探讨这些知识点。 首先,二维数组在C语言中被声明为`类型名 数组名[行数][列数]`,例如`int arr[3][4]`创建了一...

    c语言基础-c语言编程基础之数组操作示例-两个数组的交集.zip

    在C语言中,数组是一种...总的来说,C语言中的数组操作是学习编程的基础,而找出两个数组的交集是数组操作中的一个典型问题,它涉及到排序和双指针等技巧。通过掌握这些知识,你可以更好地理解和解决实际的编程问题。

    ABPLC编程软件RSLOGIX5000入门3——下载程序借鉴.pdf

    ABPLC编程软件RSLOGIX5000入门3——下载程序借鉴.pdf

    用于elctre的编程程序,主要是ELECTRE——IN法.rar

    用于elctre的编程程序,主要是ELECTRE——IN法.rar

    Visual C++.NET编程技术体验

    系统编程 5.1.4 示例——操作注册表 5.2.2 示例——系统托盘编程 5.3.3 示例——鼠标钩子程序 5.4.3 示例——文件分割器 第6章 多文档/多视图编程 6.2.4 示例1——单文档多视 6.2.5 示例2——...

    数组Array(csdn)————程序.pdf

    数组是C++编程语言中一种基本的数据结构,它允许程序员在内存中存储一组相同类型的元素。数组的定义是在连续的内存空间中分配空间,以便这些元素能够被快速访问。数组的访问非常高效,因为可以通过索引直接定位到...

    Qt与Matlab混合编程中mwArray数组使用详解

    演示Qt 5.9与Matlab 2017b混合编程中,用于传递数据的mwArray数组的使用方法,包括数组维数设置、传入数据、读取返回数据、字符串型数据等。博文地址 https://blog.csdn.net/HongAndYi/article/details/79477031

    编程技术C++数组指针与字符串

    ### 编程技术C++数组指针与字符串 #### 数组基础 - **数组概念**: - 数组是一种线性结构,它是由相同类型的多个元素组成的有序集合。 - 数组中的每个元素都可以通过一个索引(或下标)来访问。 - 数组在内存中...

    程序设计基础课件————c语言教程课件

    最后,"程序设计基础总结.ppt"是对整个课程的回顾和提炼,可能包含了关键概念的复习、常见问题解答以及编程实践的指导,帮助学习者巩固所学知识,并能够独立解决编程问题。 总的来说,这份C语言教程课件是学习程序...

    ——C语言综合编程训练——

    C语言是一种广泛应用于系统开发、软件工程和嵌入式系统的编程语言,因其高效、灵活和对硬件的直接访问能力而受到程序员的青睐。本综合编程训练主要针对C语言的新手,旨在帮助初学者掌握基本的编程概念和技能,为后续...

    数字图像处理——编程框架、理论分析、实例和源码实现的源码

    《数字图像处理——编程框架、理论分析、实例和源码实现》是一本深入探讨数字图像处理的书籍,作者孙兴华老师在其中不仅讲解了基本的理论知识,还提供了丰富的编程框架和源码实例,旨在帮助读者更好地理解和应用数字...

Global site tag (gtag.js) - Google Analytics