亲爱的大神老爷们,这是小渣第一次写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. Eclipse插件安装与使用 —— Properties Editor

    一.下载     首先当然是下载插件啦! 下载地址:http://sourceforge.jp/projects/propedit/downloads/40156/jp.gr.java_conf.us ...

  2. 理解Java的封装与接口

    1.封装,即保留有限的外部接口(interface),隐藏具体实施细节. 2.封装在生活中很常见.比如下面是一个充电电筒: 一个用户即使不看说明书,也可以猜到这个电筒的操作: 开关和充电.这个电筒用一 ...

  3. Mtk Android 打包解包*.img

    打包/解包 boot.img, system.img, userdata.img, or recovery.img [DESCRIPTION] MTK codebase编译出来的image必须使用MT ...

  4. 5个缺失的 JavaScript 数字格式化函数

    /** 下面两个函数都能对浮点数进行四舍五入,保留小数点后两位 **/ function CurrencyFormatted(amount) { var i = parseFloat(amount); ...

  5. 基于Bootstrap的超酷jQuery开关按钮插件

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAAA2CAIAAAC0tsfoAAAB/0lEQVR4nO3bQWrCQBTGcc/mbVz0DD

  6. 为什么要用Java泛型

    啥是泛型? 泛型(generic)是指参数化类型的能力.可以定义带泛型类型的类或方法,随后编译器会用具体的类型来代替它. 举个栗子 上述代码在编译期没有问题,但在运行期,将会报错.就是因为List的a ...

  7. nodejs的调试(node-inspector)

    我们在接触客户端javascript的时候,调试利器就是firebug ,也是当年为何喜欢用上firefox 浏览器的主要动力,当然,后来 chrome 插件里也出现了firebug的身影..... ...

  8. 在SQL语言中,join什么时候用,什么时候不用啊?请高手举例解释一下。谢谢

    JOIN 在内连接时,可以不使用,其它类型连接必须使用.如SELECT * FROM TABLEA INNER JOIN TABLEB ON A.ID=B.ID可以这样写:SELECT * FROM ...

  9. 小结JS中的OOP(上)

    前言:大家都知道,OOP有三大特性:封装,继承,多态.下面是自己对这三个特性的理解: 封装:把属性与方法整合到某种数据类型中.目的是让类的使用者按类的编写者的意愿去使用类.在封装过程中会一般会做两件事 ...

  10. 切换PS工具栏里的快捷键

    工具箱(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取,可以在[常规]'快捷键[Ctrl]+[k]'里设置是否使用[Shift]切换) 其它快捷键: 矩形.椭圆选框工具[M] 裁剪工具[ ...