`

一个排好序的数组,找出两数之和为M的所有组合

 
阅读更多

网上看到这个面试题,自己琢磨了下,写了几个比较简单的解决方法,请各位大虾给出自己的理解,最好能给出更为简单的解决办法

 

 

package com.liuc.test;

//一个排好序的数组,找出两数之和为M的所有组合 这里设置M为100,可以将100替换为想要让求的和
public class SumM {

	public static int[] arr = { 1, 3, 5, 7, 9, 14, 23, 70, 80, 93, 95, 100,200, 300 };
	public static int count1 = 0;
	public static int count2 = 0;
	public static int count3 = 0;

	public static void main(String[] args) {
		// 1、纯for循环
		for (int i = 0; i < arr.length; i++) {
			for (int j = i + 1; j < arr.length; j++) {
				count1++;
				if (arr[i] + arr[j] == 100) {
					System.out.println(arr[i] + ":" + arr[j]);
				}
			}
		}
		//卡住一个端,左端只有小于M/2才会判断
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] <= 100 / 2) {
				for (int j = i + 1; j < arr.length; j++) {
					count2++;
					if (arr[i] + arr[j] == 100) {
						System.out.println(arr[i] + ":" + arr[j]);
					}
				}
			}
		}
		//卡住一个端,左端只有小于M/2,右端大于M/2才会判断
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] <= 100 / 2) {
					for (int j = i + 1; j < arr.length; j++) {
						if (arr[j] >= 100 / 2) {
							count3++;
							if (arr[i] + arr[j] == 100) {
								System.out.println(arr[i] + ":" + arr[j]);
							}
					}

				}
			}
		}
		System.out.println("count1=" + count1);
		System.out.println("count2=" + count2);
		System.out.println("count3=" + count3);
	}

}
 

结果:

 

5:95

7:93

5:95

7:93

5:95

7:93

count1=91

count2=70

count3=49

 

 

 

 

分享到:
评论
3 楼 kaqike 2013-07-22  
Sorry,实际计算和的次数为9
2 楼 kaqike 2013-07-22  
实际计算和的次数为7
1 楼 kaqike 2013-07-22  
/**
 * 
 * @author Kaqike
 *
 */
public class TestSequenceSum {
	public static int[] arr = { 1, 3, 5, 7, 9, 14, 23, 70, 80, 93, 95, 100,200, 300 };  
	public static int M =100;  
	public static void main(String[] args){
		 int  i = 0;
		 int j = arr.length-1;
		 int count =0;//求和的次数
		 while(i<j){
			 count++;
			 if(arr[j]>=M)  j--;
			 int sum =arr[i]+arr[j];
			 if(sum>M){
				 j--;
			 }else if(sum==M) {
				 System.out.println(arr[i]+"  "  +arr[j]);
				 i++;
				 j--;
			 }else{
				 if(sum<M) i++;
			 }
		 }
		 System.out.println("求和的次数为"+count);
	}
}

相关推荐

    常见算法笔试或面试题

    问题:一个排好序的数组 A,长度为 n,现在将数组 A 从位置 m(m,m 未知)分开,并将两部分互换位置,假设新数组记为 B,找到时间复杂度为 O(lgn)的算法查找给定的数 x 是否存在数组 B 中? 方法:同样采用二分查找...

    计算机二级公共基础知识

    满二叉树是指这样的一种二叉树:除最后一层外,每一层上的所有结点都有两个子结点。在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上有2k-1个结点,且深度为m的满二叉树有2m-1个结点。 完全...

    算法分析与设计题目

    **题目描述**:给定`k`个排好序的序列,使用2路合并算法将这`k`个序列合并成一个序列,并设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 **解析**:采用分治法的思想,每次选择两个最短的...

    Java参考题目-填空题.pdf

    这是一个典型的数学问题,通过枚举公鸡和母鸡的数量,找出满足条件(公鸡5元,母鸡3元,小鸡1元3只)的组合。如果当前组合的小鸡数量不是3的倍数,或者总价格不等于100,则跳过这个组合。因此,正确的填空是: ```...

    201700140056_李港_实验一1

    输出子集的问题是给定一个集合,找出所有可能的子集,包括空集和自身。李港同学采用了两个数组,一个是原始数据数组,另一个是布尔数组,用于记录每个元素是否出现在子集中。在递归过程中,对于每个元素,都有出现和...

    javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号

    在具体实现中,我们可以为每个数字创建一个数组,这个数组记录该数字在它后面的数组中排在第几位。然后使用一个递归函数来计算每一位比当前数小的可能性总数。 递归函数的工作原理如下: 1. 首先计算出n个有序位置...

    算法解析ACM

    题目描述:给定一系列邮局的位置,需要选择一部分邮局来服务所有区域,使得每个区域到最近邮局的距离之和最小。此类问题可以通过动态规划来解决,通过构建一个二维数组来存储每个位置的最佳方案。 **案例分析:Pku...

    计算机算法设计实验报告

    3. **子集合问题**:这是关于从一个给定的集合中找出满足特定条件的所有子集的问题,例如寻找所有和为特定数值的子集。该问题可以通过回溯法或动态规划解决。 4. **工作分配问题**:这类问题涉及到将任务分配给多个...

    信息学竞赛真题_2591.pdf

    设 A 和 B 是两个长为 n 的有序数组,现在需要将 A 和 B 合并成一个排好序的数组,请问任何以元素比较作为基本运算的归并算法最坏情况下至少要做( )次比较。 - **知识点**: 本题考查归并排序的基本原理和最坏情况下...

    2016第七届蓝桥杯大赛CC--大学C组省赛真题详解.doc

    - 构建二维数组存储网格信息,遍历数组找出所有可能组成正方形的位置。 - 对于每个位置,检查其是否满足正方形条件(即四个角均为非特殊格子)。 - 使用循环和条件判断语句实现。 #### 打印方格问题 - **问题...

    全国计算机等级考试三级网络技术(C语言)上机---南开100题

    编写一个名为`jsValue`的函数,其功能是找出大于给定整数`m`且紧邻其后的`k`个素数,并将这些素数存储在数组`xx`中返回。最后通过调用`writeDat`函数读取10组数据并计算结果,输出至文件`out.dat`中。 **代码解析**...

    课程的内容(2020.01.30)-B.pdf

    除了找出最优解外,还要求出所有可能的解决方案的数量。 ### 区间DP 区间DP主要用于解决涉及区间范围的问题,例如计算某个区间内的最优解。常见问题如合并石子、编辑距离等。 ### 学习资源 为了更好地理解和掌握...

    算法分析与设计考博试题1

    **分治法的基本思想**:分治法是一种通过将一个复杂问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并的思想。其核心在于递归地解决子问题。 **快速排序...

    信息学竞赛真题.pdf

    题目中给出了一个正实数构成的数字三角形排列形式,并要求使用动态规划算法找到从顶部到底部某一点的一条路径,使得路径上的数字之和最大。对于这个问题,定义状态\[C[i,j]\]为从顶部到达\[(i,j)\]位置的路径上的...

    各种排序与经典分治算法

    它在文本编辑、生物信息学等领域有广泛应用,可以通过动态规划求解,时间复杂度为O(mn),其中m和n分别为两个序列的长度。 2. 最近点对问题:在二维空间中,寻找一组点中距离最近的点对。这个问题可以使用分治策略和...

    4、NOIP提高组竞赛复试中需要用到的算法或涉及到知识点.pdf

    - **埃氏筛法**:一种用于找出所有小于或等于给定正整数n的所有素数的高效算法。该方法的基本思想是从2开始,将每个素数的倍数标记为合数。 3. **mod规律公式** - 在模运算中,了解模的意义以及如何利用模进行...

    ACM巨全模板 .pdf

    8.图中找出两点间的最长距离 9.最短路 (spfa) 10.第k短路 (spfa+A*) 11.回文树模板 12.拓扑排序 (模板) 13.次小生成树 14.最小树形图(有向最小生成树) 15.并查集 (普通并查集,带权并查集,) 16.求两个节点的最近公共...

    经典C源代码30例

    验证一个偶数能否表示为两个素数之和,这是著名的哥德巴赫猜想。 #### 解决思路 - **素数判断**:通过嵌套循环判断每个数是否为素数。 - **循环匹配**:外层循环遍历所有的偶数,内层循环尝试找到符合条件的素数对...

Global site tag (gtag.js) - Google Analytics