题目:有一个无序、元素个数为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. 手把手教你打造一个心电图效果View Android自定义View

    大家好,看我像不像蘑菇-因为我在学校呆的发霉了. 思而不学则殆 丽丽说得对,我有奇怪的疑问,大都是思而不学造成的,在我书读不够的情况下想太多,大多等于白想,所以革命没成功,同志仍需努力. 好了废话不说 ...

  2. 幂次法则power law

    幂次法则分布和高斯分布是两种广泛存在的数学分布.可以预测和统计相关数据. pig中用其处理数据倾斜,实现负载均衡. 个体的规模和其名次之间存在着幂次方的反比关系,R(x)=ax(-b次方) 其中,x为 ...

  3. Errors running builder 'Integrated External Tool Builder' on project xxx

    出现这样的提示,表明你的项目的Builder项出了问题. 解决方法是: 右键项目选择"Properties",再选择"Builders",删除丢失的builde ...

  4. AngularJS进阶(十)AngularJS改变元素显示状态

    AngularJS改变元素显示状态 前言 本文描述使用AngularJS提供的ng-show和ng-hide指令实现自动监听某布尔型变量来改变元素显示状态. 控制html元素显示和隐藏有n种方法:ht ...

  5. Java-ServletRequestEvent-ServletRequestAttributeEvent

    /** * Events of this kind indicate lifecycle * events for a ServletRequest. * The source of the even ...

  6. centOS 安装(光安装 和 u盘安装)

    光盘安装用这个: http://www.williamlong.info/archives/1912.html 是否保留win7,要作好相关配置.有些插件可以不装. 网络设置:不好弄 如果用u盘安装, ...

  7. Zip操作的工具类

     /** * Copyright 2002-2010 the original author is huanghe. */package com.ucap.web.cm.webapp.util; ...

  8. Android开发技巧——自定义单选或多选的ListView

    这篇其实应该是属于写自定义单选或多选的ListView的基础教程,无奈目前许多人对此的实现大多都绕了远路,反而使得这正规的写法倒显得有些技巧性了. 本文原创,转载请注明在CSDN上的出处: http: ...

  9. Leetcode_234_Palindrome Linked List

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/47334465 Given a singly linked ...

  10. kettle 的表输出 table output

    kettle的表输出: 双击后,看设置, 1,在connecttion后面,点击new里新建一个.设定各个选项值,如选择mysql类型,则配置hostname,database name,端口, 用户 ...