有一个无序、元素个数为2n订的正整数数组,要求:如何能把这个数组分割成元素个数为n的两个数组,并使子数组的和最接近?
以下是我写的代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
ArrayList heap[];
int num[],n,i,j,sum=0,temp;
Iterator it;
//读取数组元素
Scanner in = new Scanner(System.in);
n = in.nextInt();
num = new int[n+1];
heap = new ArrayList[n/2+1];//用来保存从数组中取i个元素所能产生的和
for(i=1;i<=n;i++){
num[i] = in.nextInt();
sum += num[i];
}
//初始化
heap[0] = new ArrayList();
heap[0].add(0);
for(i=1;i<=n;i++){
int j_max = i < n/2-1 ? i : n/2-1;
for(j=j_max;j>=0;j--){
if(heap[j] == null) heap[j] = new ArrayList();
it = heap[j].iterator();
while(it.hasNext()){
temp = (Integer)(it.next());
if(temp + num[i] < sum / 2){//只取和小于总和一般的数
if(heap[j+1] == null) heap[j+1] = new ArrayList();
heap[j+1].add(num[i] + temp);
}
}
}
}
it = heap[n/2].iterator();
int max = 0;
while(it.hasNext()){
temp = (Integer)it.next();
if(temp > max) max = temp;
}
System.out.println(max + ":" + (sum-max));
}
}
还有什么更好的方法吗?
分享到:
相关推荐
4. **140.py** - 可能是LeetCode的140题,"Word Break II"(单词拆分II),这是一道动态规划问题,需要构建一个动态规划数组来解决。 5. **139.py** - 这可能是LeetCode的139题,"Word Break"(单词拆分),与140题...
2. **区间合并**:这是一道数据结构和算法题,主要考察区间合并和排序。可以使用并查集或者线段树来处理这种问题,首先按区间起点排序,然后依次合并相邻的区间。 3. **最长字符串输出**:这是字符串处理和排序的...
本题解将深入探讨LeetCode上的第4题——“寻找两个正序数组的中位数”,这是一道涉及到数组操作和查找策略的问题,对于理解数据结构和算法有着重要意义。 首先,我们要明确“中位数”的概念。在一组数值中,中位数...
本题是一道经典的图论问题,目标是在一个有向无环图中寻找一条从指定起点出发的路径,使得该路径上的节点权重之和最大。 **知识点解析**: 1. **图的基本概念**:首先需要了解图的基本构成要素,包括节点(顶点)...
Java 实现串处理可以使用 String 类的相关方法,例如 toUpperCase() 方法将字符串转换为大写,split() 方法将字符串分割成多个子串,trim() 方法将字符串两端的空格去除。 3. 递归算法 递归算法是指函数调用自身的...
3. **字符串分割**:找到每个字符串中的最后一个“o”字符,并将其作为分割点。 4. **字符串重组**:将字符串分为两部分,重新组合后将结果存储回原数组。 #### 题目四:字母字符串的提取与重组 **题目概述**: ...
该题的解法是通过数学分析和计算,可以按照位数将1到n的数字范围分割开,对每个位数的范围计算x出现的次数,最后将这些次数相加即可。这道题目考察了对整数各个位数的处理和频数统计的算法。 NOIP2012年普及组第一...
归并排序是一种稳定的排序算法,它通过分治策略将数组分割成两半,递归地排序每一半,然后将它们合并成一个有序数组。 #### 复杂度分析 - **时间复杂度**:归并排序的平均和最坏时间复杂度均为O(nlogn),这使得它在...
颜色识别问题在图像处理和计算机视觉中非常常见,通常需要运用色彩空间转换、阈值分割等技术来实现。 #### 18. 面试题18:桶排序算法 桶排序是一种分布式排序算法,通过将元素分配到若干个“桶”中,然后对每个桶...
"寻找两个正序数组的中位数"是LeetCode上的一道经典题目,涉及到数组操作和排序算法。本题解将详细探讨这个问题的解决方案及其背后的逻辑。 首先,我们需要明确问题的要求:给定两个长度为n和m的正序数组nums1和...
- **3.1.1 Spots**:该题要求设计一种方法来统计斑点的数量,涉及到**图像处理**或**数组操作**的相关知识。 - **3.1.2 Cowfix**:本题考察了**字符串处理**技巧,可能需要用到模式匹配算法。 - **3.1.3 Route**:...
- 在解答题中,有一道题目要求实现数组的反转,这可以通过两个指针分别从两端开始交换元素来实现,如参考程序所示。 5. 算法设计: - 主要考察的是如何根据给定的逻辑设计出相应的程序,如找出数组中的最大元素并...
在本压缩包中,我们关注的是一个与JavaScript编程、LeetCode面试及动态规划相关的知识点——第416题“分割等和子集”。这是一道经典的算法问题,常见于求职面试,尤其是对于寻找前端开发职位的应聘者。下面将详细...
首先,题集的开篇便通过一道涉及素数计算的编程题,引导考生进入算法设计的门槛。素数作为数学领域的一个基本概念,其计算和判断是程序员必须掌握的基础技能。在本题中,考生需要实现一个名为`num`的函数,该函数...
这是一道关于数组排序的问题,目标是将数组分为负数、0和正数三个部分,但每个部分内部无需排序。可以采用双指针法,一个指针从左侧开始,一个从右侧开始,中间位置作为0的存放位置。在遍历过程中,将元素移动到正确...
在本题中,我们面临的是一个经典的动态数组问题,需要处理数组元素的修改、区间求和以及区间最大值的查询。 **问题描述:** 给定一个由`n`个格子组成的数组,初始时每个格子有一个权值。我们需要处理`m`次操作,...
该题要求求解数组中具有相同和的所有连续子数组中的最小长度。 **核心知识点**: 1. **前缀和**:利用前缀和快速计算子数组的和。 2. **滑动窗口**:使用滑动窗口技巧来寻找符合条件的子数组。 3. **哈希表**:记录...
在备考过程中,不仅要通过做题来提高解题速度和准确度,还要注重理论知识的巩固,理解每一道题背后的原理。同时,实践操作是关键,不断动手编写代码,遇到问题及时解决,才能在实际考试中游刃有余。希望这份"Java...
对于初学者来说,这是一道很好的练习题,旨在帮助他们熟悉C++中的基本数据结构和算法。 **详细解析:** - **输入处理:** 首先读入一个整数`n`,表示木棍的数量。接着读入`n`个整数,表示每根木棍的长度。 - **排序...
处理这种问题通常可以使用字符串处理函数,如分割字符串、反转数组等方法。 2. **成绩管理** 这道题目要求实现一个成绩管理系统,可以插入成绩并查询。首先,输入一个整数T,代表有T组数据。每组数据开始时,输入...