题目:有一个无序、元素个数为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. android官方技术文档翻译——工具属性

    本文译自androd官方技术文档<Tools Attributes>:http://tools.android.com/tech-docs/tools-attributes 本文地址:ht ...

  2. XBMC源代码分析 7:视频播放器(dvdplayer)-输入流(以libRTMP为例)

    前文分析了XBMC的基本结构: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分 ...

  3. Linux Shell 命令--grep

    从这篇开始,是文本内容操作,区别于文本操作. shell,perl,python,一直都是文本操作的专家语言,而我们今后学习的的将是shell的噱头--文本操作.下面提到最常见的一个: grep 这算 ...

  4. Shell 正则表达式总结及其含义举例

    基本元字符集及其含义: ^  只匹配行首 $   只匹配行尾 *   只一个单字符后紧跟*,匹配0个或多个此单字符 [ ]   只匹配[ ]内字符.可以是一个单字符,也可以是字符序列.可以使用 - 表 ...

  5. 01_JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码),javah命令使用

    1 什么是JNI JNI Java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(C/C++) 通过这个协议,java代码就可以调用外部的C/C++代码,外部的C/C++ ...

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

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

  7. 网站开发进阶(十七)Html元素隐藏的几种方式

    Html元素隐藏的几种方式 隐藏Html元素的方法最常用的方法有css的display:none,一种方法两种实现方式,感兴趣的朋友可以了解下. 1.使用css style="display ...

  8. DH密钥交换非对称加密

    迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange,简称"D–H") 是一种安全协议. 它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起 ...

  9. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  10. Java 去掉字符串中的换行符回车符等

    去掉一个字符串中的换行符.回车符等,将连续多个空格替换成一个空格 String string = "this just a test" Pattern p = Pattern.co ...