题目:有一个无序、元素个数为2n的正整数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组的和最接近?

1 1 2 -> 1 1 vs  2

看题时,解法的时间复杂度一般都大于或等于O(n^2)。突然灵感一闪,发现一个新的解法,应该算是一个动态规划的过程吧,思路比较简单,请看代码。空间复杂度O(nlogn),时间复杂度O(n)。但是不能确定是否适用所有正整数组,如果有错,请给出你的测试用例,谢谢!

代码如下:

   #include <iostream>
#include <vector>
using namespace std; int compare(const void *in_iLeft, const void *in_iRight) {
int *a = (int*) in_iLeft;
int *b = (int*) in_iRight;
return *a - *b ; }
int main() {
vector<int> t_Vec;
int t_ivalue;
int t_iLen = ;
cin >> t_ivalue;
while(t_ivalue != ) { //输入为0,则停止输入
t_Vec.push_back(t_ivalue);
t_iLen ++;
cin >> t_ivalue; }
int* t_pArr = new int[t_iLen];
for(int i = ; i < t_iLen; i++) {
t_pArr[i] = t_Vec[i];
}
qsort(t_pArr, t_iLen, sizeof(int), compare);
int* t_pLeftArr = new int[t_iLen];
int* t_pRightArr = new int[t_iLen];
memset(t_pLeftArr, , t_iLen);
memset(t_pRightArr, , t_iLen);
int t_iSumLeft = t_pArr[t_iLen-];
int t_iSumRight = t_pArr[t_iLen-];
int t_iLeftIter = ;
int t_iRightIter = ;
t_pLeftArr[] = t_pArr[t_iLen-];
t_pRightArr[] = t_pArr[t_iLen-];
for(int i = t_iLen - ; i >= ; i --) {
if(t_iSumLeft < t_iSumRight) {
if(t_pArr[i] > ) {
t_pLeftArr[t_iLeftIter ++] = t_pArr[i];
t_iSumLeft += t_pArr[i];
}else {
t_pRightArr[t_iRightIter ++] = t_pArr[i];
t_iSumRight += t_pArr[i];
}
}else {
if(t_pArr[i] > ) {
t_pRightArr[t_iRightIter ++] = t_pArr[i];
t_iSumRight += t_pArr[i];
}else {
t_pLeftArr[t_iLeftIter ++] = t_pArr[i];
t_iSumLeft += t_pArr[i];
}
}
}
cout << "打印原序列:"<< endl;
for(int i = ; i < t_iLen; i ++) {
if(t_pArr[i] != ) {
cout << t_pArr[i] << " ";
}else {
break;
}
}
cout << endl; cout << "打印第一个序列:";
for(int i = ; i < t_iLeftIter; i ++) {
if(t_pLeftArr[i] != ) {
cout << t_pLeftArr[i] << " ";
}else {
break;
}
}
cout << endl;
cout << "第一个序列合为:" << t_iSumLeft << endl; cout << "打印第二个序列:";
for(int i = ; i < t_iRightIter; i ++) {
if(t_pRightArr[i] != ) {
cout << t_pRightArr[i] << " ";
}else {
break;
}
}
cout << endl;
cout << "第二个序列合为:" << t_iSumRight << endl;
t_Vec.clear();
delete[] t_pArr;
delete[] t_pLeftArr;
delete[] t_pRightArr;
system("pause");
return ; }

但是如果题目改成任意整数时你该怎么解答了呢? :)

编程之美2.18 数组分割 原创解O(nlogn)的时间复杂度求解:的更多相关文章

  1. 编程之美2014挑战赛 复赛 Codehunt平台试题答案

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  2. Python编程之美:最佳实践指南PDF高清完整版免费下载|百度云盘|Python新手到进阶

    百度云盘:Python编程之美:最佳实践指南PDF高清完整版免费下载 提取码:1py6 内容简介 <Python编程之美:最佳实践指南>是Python用户的一本百科式学习指南,由Pytho ...

  3. LeetCode:Climbing Stairs(编程之美2.9-斐波那契数列)

    题目链接 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either c ...

  4. 编程之美2.5:寻找最大的K个数

    编程之美2.5:寻找最大的K个数 引申:寻找第k大的数: 方法一: // 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array ...

  5. 24点C++程序实现 编程之美1.16

    解法1,对于任意输入的四个数字,给出一个24点的解法,若无解,则没有输出. 原理参照下图(编程之美原书) 代码如下,仅供参考 // 1.16.cpp : Defines the entry point ...

  6. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软“编程之美”挑战赛在选手的火热比拼中圆满落下帷幕.“编程之美”挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起,微软每年都在革新比赛命题.紧跟时代潮流, ...

  7. 编程之美2015初赛第一场 hihoCoder #1156 : 彩色的树(染色问题)

    #1156 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, , …, n.树中有n - 1条边,任意两个节点间恰好有一条 ...

  8. hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)

    题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 ...

  9. hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)

    题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路 ...

随机推荐

  1. python的join(string)函数

    join是字符串操作函数,操作的也是字符串. key="\t".join(('a','b','c')) result= key.split("\t") prin ...

  2. HTML5进阶(二)HBuilder实现软件自动升级

    HBuilder实现软件自动升级 前言 移动APP开发好后需要实现软件自动升级功能,经过一番搜索,发现HBuilder具有"App资源在线升级更新"的功能,遂研究之. 经过一番测试 ...

  3. android放大镜效果实现

    概述 我相信很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView ex ...

  4. 程序压力测试、性能测试AB、Webbench、Tsung

             负载生成器是一些生成用于测试的流量的程序.它们可以向你展示服务器在高负载的情况下的性能,以及让你能够找出服务器可能存在的问题.为了得到更加客观和准确的数值,应该从远程访问.局域网访问 ...

  5. Ubuntu 14 安装Skype 4.3

    Ubuntu 14 安装Skype 4.3Step 1: 删除老版本sudo apt-get remove skype skype-bin:i386 skype:i386 sudo apt-get i ...

  6. 反对网抄,没有规则可以创建目标"install" 靠谱解答

    在ubuntu下遇到这个问题,原因其实很简单,你不能用WINDWOS下的方法用图形方式打开,然后点了一下按扭"解压缩",生成了一个文件夹. 的确,这个文件夹看起来和正常的没有什么区 ...

  7. UML之包图

    包图是UML中用类似于文件夹的符号表示的模型元素的组合,系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中,使用包图可将相关元素归入一个系统,一个包中包含附属包.图表或单个元素.简单的来说, ...

  8. LeetCode之“数学”:Rectangle Area

    题目链接 题目要求: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle i ...

  9. Myexclipse创建Junit测试

    . 下载JUnit的jar文件,下载地址在这里 2. 在MyEclipse中新建一个要测试的项目HelloJUnit 3. 添加一个要测试的类HelloJUnit,代码如下,注意需要先建package ...

  10. Hadoop RPC

    hadoop rpc机制 && 将avro引入hadoop rpc机制初探 1 RPC RPC(Remote Procedure Call)--远程过程调用,它是一种通过网络从远程计算 ...