给一已经排序数组A和x,求A中是否包含两个元素之和为x

亲爱的大神老爷们,这是小渣第一次写blog,欢迎大家来喷(批评指正),算法渣因为面试中连这道题都不会写就自己琢磨了一下,也参考了网上大家的做法

解法一:

思路:从首尾向目的靠拢,因为已经排序,【假设存在A[i]+A[j]=x】  (i<j:这样的i,j对可能不止一对,只要确保如果存在这样的i,j对,设计的算法一定能找到其中一对算法就算有效,该算法找到的是【最小i和最大j】那一对,那么在查找过程中始终有:【A[head]<=A[i]&&A[j]<=A[tail]】):

在靠拢的过程中head从0开始增加,tail从A.length-1开始减小,若A[head]+A[tail]>x,必然有tail>j,所以要做的就是减小tail,同理,在和小于x时,必有head<i,增大head即可

代码:如果乱序输入,自己写个排序就好

# include <iostream.h>
# include "IO_tools.cpp"
void main(){
   int A[6];
   inputA(A,6);
   outputA(A,6);
   int x;
   int i,j,sum=0;
   while(true){
	  cout<<"Input x:";
      cin>>x;
	  i=0;j=5;
      while(i<j){
	     sum=A[i]+A[j];
		 if(sum==x){
		     cout<<"x="<<A[i]<<"+"<<A[j]<<endl;
			 break;
		 }
	      else if(sum<x)
		     i++;
	      else
		     j--;
	  }
   }
}

 解法2:考察A[i](i from 0 to A.length):如果存在A[j]=x-A[i]【i!=j】,结束,找到;如果遍历完数组未找到这样的一对元素,结束

进一步细化:对A排序后,如果A[i]<x-A[i],则在i之后找x-A[i]就好,否则在i之前找。

错误分析:之前并未对查找的区间做限制,那么如果并不存在这样的两个元素,而恰好2*A[i]=x,则会误把A[i]当成两个元素使用,从而导致该算法并不正确。

# include <iostream.h>
# include "IO_tools.cpp"
# include "Merge_sort.cpp"
# include "binary_search.cpp"
void main(){
   int A[10],i=10,find;
   //初始化
   inputA(A,10);
   outputA(A,10);
   //归并排序
   Merge_sort(A,0,9);
   //输出结果
   cout<<"After Sorted:";
   outputA(A,10);
   while(true){
      int x;
      cout<<"Input x:";
      cin>>x;
	  i=10;
	  find=0;
	  //按目的数与当前数的大小关系确定目的数所在区间(如果目的数存在);错误避免:A[i]+A[i]=x时不会误把一个数当两个数用;效率提升:不要在整个数组内查找;
      while(i--){
		  //二分查找:前提是已经排序
		  int aim=x-A[10-i-1];
		  int result=aim<A[10-i-1] ? binary_search(A,aim,0,10-i-2) : binary_search(A,aim,10-i,9);//result为目的数数组下标(-1代表目的数不存在)
	      if(result>=0){
		      cout<<"Find it:"<<A[10-i-1]<<"+"<<aim<<"="<<x<<endl;
			  find++;
		      continue;//找到所有结果
		 }
	  }
	  if(find==0){
	     cout<<"Not Found!"<<endl;
	  }
   }
}

  

时间: 2024-08-02 04:56:31

给一已经排序数组A和x,求A中是否包含两个元素之和为x的相关文章

Python中2维数组/矩阵转化为字典(矩阵中第一列含有重复元素)??

例如将a=[[3,789],[1,100],[1,102],[2,102],[1,106],[2,456]];转化为一个字典b={1:[100,102,102],2:[102,456],3:[789]} 如果用强制转换: 1 >>> a=[[3,789],[1,100],[1,102],[2,102],[1,106],[2,456]]; 2 >>> b=dict(a) 3 >>> b 4 {1: 106, 2: 456, 3: 789} 5 >&

[LeetCode]4. Median of Two Sorted Arrays两个排序数组合并后的中位数

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 解法一:不考虑时间复杂度限制在O(log(m+n)),则将两个数组遍历一遍即可以组合成一个排好序的数组,然后取数组的中位数即可,时间复杂度O(m+n): c

在排序的数组中交换两个元素

如题,在一串已经排序好的数中,交换了两个元素.例如: nums[] = {1,2,3,4,5,6,7,8,9,10} 交换两个元素(例如交换数字5和9)后: nums[] = {1,2,3,4,9,6,7,8,5,10} 问题是怎么在数组中找到这两个元素? 思路 假设交换的两个元素为x和y,且x < y.其他的数为Ni.那么问题可以表示为: nums[] = {N1 , N2 , N3 , Ni , x , Ni+2 , ... , y , ...,Nm } 交换x和y后 nums[] = {N

LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)

题目:合并已排序数组 难度:Easy 题目内容: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. 翻译: 给定两个排序的整数数组nums1和nums2,将nums2合并到nums1中作为一个排序数组. 注意: nums1和nums2中初始化的元素数量分别为m和n. nums1有足够的空间(大小大于或等于m+n)来容纳nums2中的额外元素. 我的思路:此处和归

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

灵魂拷问:如何检查Java数组中是否包含某个值 ?

摘自:https://www.cnblogs.com/qing-gee/p/12053156.html 在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下. 另外,我想要告诉大家的是,作为程序员,我们千万不要轻视这些基础的知识点.因为基础的知识点是各种上层技术共同的基础,只有彻底地掌握了这些基础知识点,才能更好地理解程序的运行原理,做出更优化的产品. 我曾在某个技术论坛上分享过

数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 程序实现: import java.util.Scanner; public class Test38 { public static void main(String[] args) { /**  * 初始化数组,测试数据可以多种途径初始化  */   Scanner in = new Scanner(System.in); /*int[] a = 

专题总结—二分查找与旋转排序数组

1.二分搜索的模板. 算法面试中,如果需要优化O(n)的时间复杂度,那么只能是O(logn)的二分法. 注意二分法大多数情况都是适用于排序数组. http://www.lintcode.com/zh-cn/problem/first-position-of-target/ class Solution { public: /** * @param nums: The integer array. * @param target: Target number to find. * @return:

leetcode链表--13、median-of-two-sorted-arrays(两个排序数组的中位数,时间复杂度)

题目描述 There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 题目解析:本题关键之处在于时间复杂度要求为O(log(m+n)),本题如果采用合并并排序两数组的方式,时间复杂度为O((m+n)*log(n+m))但是在牛客网上