亲爱的大神老爷们,这是小渣第一次写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;
}
}
}

  

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

  1. C语言:计算输出给定数组中每相邻两个元素的平均值的平方根之和。

    //计算输出给定数组中每相邻两个元素的平均值的平方根之和. #include <stdio.h> #include <math.h> ]) { double a,b,s=0.0 ...

  2. 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.

    在网上看到过一个面试题,感觉挺有意思,看别人的代码写的逻辑不够谨慎,重写了一个,较真了又... package com.array7.algorithm; public class Algorithm ...

  3. [Swift]LeetCode81. 搜索旋转排序数组 II | Search in Rotated Sorted Array II

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  4. LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于数组中. ...

  5. 【1】【leetcode-33,81】 搜索旋转排序数组

    (没思路) 33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给 ...

  6. LeetCode(81): 搜索旋转排序数组 II

    Medium! 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给 ...

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

    题目:合并已排序数组 难度:Easy 题目内容: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as ...

  8. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  9. 【LeetCode】删除排序数组中的重复项&&移除特定元素【双指针,原地算法】

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

随机推荐

  1. OpenMp之false sharing

    关于false sharing的文章,网上一大堆了,不过觉得都不太系统,那么下面着重系统说明一下. 先看看外国佬下的定义: In symmetric multiprocessor (SMP) syst ...

  2. OpenMp之sections用法

    section语句是用在sections语句里用来将sections语句里的代码划分成几个不同的段 #pragma omp [parallel] sections [子句] {    #pragma ...

  3. 判断线段相交 -- 51nod 1264 线段相交

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 三角形的有向面积:a.x*b.y+b.x*c.y+c.x*a.y ...

  4. 【HDOJ】5657 CA Loves Math

    1. 题目描述对于给定的$a, n, mod, a \in [2,11], n \in [0, 10^9], mod \in [1, 10^9]$求出在$[1, a^n]$内的所有$a$进制下的数并且 ...

  5. BISTU-(1)-4-17-2016

    A:贪心,遍历每次维护一个最便宜的价格,假如当前价格不如此前价格,就用此前价格购买当前数量的肉,每次更新最便宜的价格. #include <algorithm> #include < ...

  6. MINA经典入门例子----Time Server

    原文地址 http://blog.sina.com.cn/s/blog_720bdf0501010b8r.html 貌似java的IO.NIO的入门例子都有相关的Time Server Demo.本例 ...

  7. cmd.exe-应用程序错误 应用程序无法正常启动(0xc0000142)

    之前还好好的,突然就遇到这个问题,运行CMD报错(如上图),后面无论怎么重启都是这样. 导致所有与CMD相关的程序任务都出错,例如Ctrl+Alt+Delete 只好开始各种百度谷歌 找到如下几种解决 ...

  8. Linux进程控制(二)

    1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h&g ...

  9. [ionic开源项目教程] - 第7讲 实现下拉刷新上拉加载ion-refresher和ion-infinite-scroll

    第7讲 实现下拉刷新上拉加载ion-refresher和ion-infinite-scroll 1.将tab1.html的代码改为如下: <ion-content> <ion-ref ...

  10. dede调用第一张大图,非缩略图

    1.找到include/extend.func.php加入现在函数 function firstimg($str_pic) { $str_sub=substr($str_pic,0,-7)." ...