题目:有一个无序、元素个数为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. Java中回调函数编写

    package XXX.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStr ...

  2. Eclipse下载GitHub源码

    1. 可以通过Eclipse->File->Import->Project from Git->URI来提取工程   2. 也可以通过打开git仓库视图(Eclipse 自带了 ...

  3. javascript语法之循环语句

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 《java入门第一季》之面向对象接口面试题

    首先,(1)叙述接口的成员特点: /* 接口成员特点 成员变量:只能是常量,默认都是常量,并且是静态的. 默认修饰符:public static final 建议:自己手动给出类似:public st ...

  5. 算法面试题-leetcode学习之旅(二)

    题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...

  6. 使用SVM对多类多维数据进行分类

    最近,本人要做个小东西,使用SVM对8类三维数据进行分类,搜索网上,发现大伙讨论的都是二维数据的二分类问题,遂决定自己研究一番.本人首先参考了opencv的tutorial,这也是二维数据的二分类问题 ...

  7. iOS真机调试步骤(Xcode8.0以上版本)(2015年)

    方法/步骤(转载:http://jingyan.baidu.com/article/22fe7ced20cc073002617f97.html) 获取真机调试的证书,先在本地生成获取证书的文件,找不到 ...

  8. XMPP系列(二)----用户注册和用户登录功能

    1.创建一个新工程 2.导入XMPP框架 最新的XMPP框架下载地址:https://github.com/robbiehanson/XMPPFramework 将XMPP的几个文件夹拖进工程中,需要 ...

  9. EBS initialization parameters - Healthcheck

    APPLIES TO: Oracle EBS Applications Performance - Version 11.5.10.2 to 12.2 [Release 11.5.10 to 12.2 ...

  10. obj-c中-fobjc-arc-exceptions的解释

    在开启ARC之后正常情况下一切和内存有关的申请和释放操作皆不用你关心了,ARC全全帮你包办了.但是还有极少数的情况下,编译器无法为你生成合适的ARC额外代码,比如obj-c异常就是这么一个例子. 话句 ...