`

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

阅读更多

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

 

本文来自: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语言编程题之数组操作将数组分成和相等的三个部分.zip

    本编程题的目标是将一个数组分成和相等的三个部分,这是一个涉及到数组遍历、条件判断和数学计算的问题。下面我们将详细探讨这个问题的解决步骤和相关知识点。 1. **数组的定义与初始化**: 在C语言中,数组可以...

    LabView图形化编程语言之输入文字数字等——点阵显示文字.zip

    本资源包“LabView图形化编程语言之输入文字数字等——点阵显示文字.zip”主要探讨了在LabView中如何利用点阵显示技术来呈现文字和数字。 点阵显示是将字符或图像分解成像素矩阵,每个像素可以是开或关的状态,从而...

    c语言编程题之数组操作自除数.zip

    本主题聚焦于“数组操作自除数”的编程题目,这是一个涉及数值运算和数组处理的问题。首先,我们需要理解什么是自除数。 自除数是指一个整数,当它被它的每一位数字去除时,都可以得到整数结果。例如,128是一个自...

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

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

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

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

    c语言编程题之数组操作高度检查器.zip

    本编程题“数组操作高度检查器”旨在考察你对C语言数组操作的理解以及问题解决能力。在这个题目中,你可能需要编写一个程序,该程序能够处理二维数组,模拟一种“高度检查”的过程。 首先,你需要理解二维数组的...

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

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

    实验6+数组——二维数组和字符数组.doc

    接下来,本篇报告将详细解读二维数组和字符数组的实验内容,以期加深对数组应用的理解,并掌握相关编程技能。 首先,让我们回顾一下数组的定义及其基本操作。数组是一组有序的变量集合,它们都拥有相同的数据类型。...

    北京科技大学_可编程控制器_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语言入门编程之数组操作两数之和.zip

    在“两数之和”的问题中,我们的目标是遍历数组,找出是否存在两个元素arr[i]和arr[j],满足arr[i] + arr[j] = target。这个问题可以通过简单的双指针法解决,这是一种高效且直观的方法。 1. 初始化两个指针,一个...

    C语言二维数组编程练习

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

    c语言编程题之数组操作最后一块石头的重量.zip

    本编程题“数组操作最后一块石头的重量”显然与数组处理和计算有关,可能是要求编写一个程序来解决特定的问题,例如计算某种序列或者进行某种特定的数学运算。 在C语言中,数组的定义通常如下: ```c 数据类型 数组...

    c语言编程题之数组操作删除排序数组中的重复项.zip

    这是一个涉及数组操作、内存管理和效率优化的问题。 首先,我们需要理解排序数组的特点。排序数组是指数组中的元素按照一定的顺序排列,通常是升序或降序。这种特性使得我们可以通过比较相邻元素来查找并删除重复项...

    c语言编程题之数组操作最大连续1的个数.zip

    在给定的编程题目“数组操作最大连续1的个数”中,我们需要找到一个二进制数组(即只包含0和1的数组)中连续1的最大个数。这个问题涉及到数组遍历、条件判断以及计数技巧,是C语言编程中常见的算法问题。下面将详细...

    c语言入门编程之数组操作种花问题.zip

    在"种花问题"这个编程实例中,我们很可能会遇到如何利用数组来解决实际问题的情况。C语言中的数组操作是学习编程的重要一环,下面我们将深入探讨这个主题。 首先,数组是由同一类型的元素组成的有序集合,它们在...

    c语言编程题之数组操作公平的糖果交换.zip

    在本编程题“公平的糖果交换”中,我们可能需要处理一个整数数组,通过一定的逻辑来解决糖果分配的问题,确保分配是公平的。下面我们将深入探讨C语言中的数组操作以及如何解决这个问题。 首先,理解数组的基本概念...

    Java编程中数组的深入解析及其常用操作技巧

    内容概要:本文档详细介绍了Java编程中数组的概念,数组的声明、创建、初始化,以及各种常用的数组操作技巧。首先讲解了数组的基本特征——长度固定、同类型存储及在堆中的分配;接着深入探讨了不同维度的数组声明、...

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

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

Global site tag (gtag.js) - Google Analytics