题目:有一个无序、元素个数为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. Linux的文件系统及其硬盘分区挂载原理

    如果您是一位新手,也许 您还不知道如何把文件从Windows拷贝到Linux上吧?下面,我们将说明Unix文件系统以及mount的工作过程,然后再比较详细地讨论. mount的使用和有关选项.如果您已 ...

  2. BottomSheet底部动作条使用

    底部动作条 底部动作条(Bottom Sheets)是一个从屏幕底部边缘向上滑出的一个面板,使用这种方式向用户呈现一组功能.底部动作条呈现了简单.清晰.无需额外解释的一组操作. 使用环境 底部动作条( ...

  3. chrome "Provisional headers are shown"

    我的问题的,每次打开浏览器,点开有视频的页面(云平台的存储),然后当视频还没有加载完,就马上关闭,连续操作很多次(测试的暴力测试把),F12查看就有很多很多在加载中的连接,因为连续点击太多次了,第一个 ...

  4. 前端框架Bootstrap - 快速搭建网站

    Bootstrap简介         Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.是一个CSS/HTML/JavaScript框架.Bootstrap是基于HTML5和C ...

  5. C语言实现万年历

    给出你想知道的年份,便可以计算出该年对应的每个月每个日所对应的星期数,是不是感觉很好玩 ? #include <stdio.h> #include<stdlib.h> long ...

  6. Android轶事之View要去大保健?View大小自己决定?

    -"爹,我要吃糖" -"好哒儿子" -"爹,我要吃包包" - "好哒儿子" - "爹,我要吃串串" ...

  7. Understanding and Using HRMS Security in Oracle HRMS

    Understanding and Using HRMS Security in Oracle HRMS Product:Oracle Human Resources Minimum Version: ...

  8. Github Coding Developer Book For LiuGuiLinAndroid

    Github Coding Developer Book For LiuGuiLinAndroid 收集了这么多开源的PDF,也许会帮到一些人,现在里面的书籍还不是很多,我也在一点点的上传,才上传不到 ...

  9. Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

    Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...

  10. 【Matlab编程】matlab 画图

    1.  不用截图工具就可以将图保存成图像格式,并且没有背景颜色:saveas(gcf ,'outputname','png/jpg'),第三项省略时默认为fig.m文件 2.  计算形如(-1)^2/ ...