在排序数组中查找和为定值的两个数

题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。

例如输入数组1, 2, 4,7, 11, 15和数字15。由于4+11=15,因此输出是4和11。

分析:如果不考虑时间复杂度,最简单想法莫过于先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字,但是这种思路的时间复杂度是O(n2)。

假设现在随便在数组找到两个数,如果它们的和等于输入的数字,那就找到了;如果小于输入数字,则把两个数的和调整大一点,把较小的数字往后面移动一个数字;如果大于输入数字,则把两个数的和调整小一点,把较大的数字往前面移动一个数字;这样它们的和就有可能等于输入的数字了。

总结起来,最初找到数组的第一个数字和最后一个数字,当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于输入的数字时,把较小的数字往后移动;当然也有可能出现没有等于输入数字的情况,要加以判断。

代码如下:

/////////////////////////////////////////////////////////////////
// Find two numbers with a sum in a sorted array
// Output: true is found such two numbers, otherwise false
/////////////////////////////////////////////////////////////////
bool FindTwoNumbersWithSum
(
int data[], // a sorted array
unsigned int length, // the length of thesorted array
int sum, // the sum
int& num1, // the first number, output
int& num2 // the second number, output
)
{
bool found = false;
if(length < 1)
return found; int ahead = length - 1;
int behind = 0; while(ahead > behind)
{
long long curSum = data[ahead] + data[behind]; // if the sum of two numbers is equal to the input, then found them
if(curSum == sum)
{
num1 = data[behind];
num2 = data[ahead];
found = true;
break;
}
// if the sum of two numbers is greater than the input, delete the greater number
else if(curSum > sum)
ahead--;
// if the sum of two numbers is less than the input, increase the less number
else
behind++;
}
return found;
}

【Data Structure & Algorithm】在排序数组中查找和为定值的两个数的更多相关文章

  1. (1)Two Sum--求数组中相加为指定值的两个数

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  2. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

  3. [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I]

    [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I] 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出 ...

  4. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  5. 每日一题 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目信息 时间: 2019-07-04 题目链接:Leetcode tag:二分查找 哈希表 难易程度:简单 题目描述: 统计一个数字在排序数组中出现的次数. 示例1: 输入: nums = [5,7 ...

  6. [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)

    ##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...

  7. 剑指 Offer 53 - I. 在排序数组中查找数字 I + 二分法

    剑指 Offer 53 - I. 在排序数组中查找数字 I Offer_53_1 题目描述 方法一:使用HashMap package com.walegarrett.offer; /** * @Au ...

  8. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  9. 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...

随机推荐

  1. cocos2d-x项目101次相遇:在HelloWorld上--建立新场景

    cocos2d-x 101次相遇 / 文件夹  1   安装和环境搭建 -xcode  2   Scenes , Director, Layers, Sprites 3   建立图片菜单  4   在 ...

  2. $modal 参数 以及 使用方法

    $modal是一个可以迅速创建模态窗口的服务,创建部分页,控制器,并关联他们 $modal仅有一个方法open(options) templateUrl:模态窗口的地址 template:用于显示ht ...

  3. LookAround开元之旅

    http://blog.csdn.net/lancees/article/details/17696805

  4. easyui datagrid 加载静态文件中的json数据

    本文主要介绍easyui datagrid 怎么加载静态文件里的json数据,开发环境vs2012, 一.json文件所处的位置 二.json文件内容 {"total":28,&q ...

  5. codeforces 469B Chat Online 解题报告

    题目链接:http://codeforces.com/problemset/problem/469/B 题目意思:给出 Little Z 的上线时间段,分别是[a1, b1], [a2, b2],.. ...

  6. Spring MVC 注解json 配置

    1.首先在pom.xml中添加依赖jar包 <dependency>        <groupId>org.codehaus.jackson</groupId>  ...

  7. 关于“C++语言程序设计”书的一个类

    class book{    char* title;    int num_pages;    int cur_page;public:    book(const char* theTitle, ...

  8. vmware 克隆linux虚拟机后的网卡修改方法

    VMware虚拟机安装好CentOS6.5系统后,纯净的系统多克隆几份出来方便后期做试验.克隆步骤很简单,克隆后出现的问题是克隆后的网卡MAC地址和原系统MAC地址一样,在局域网内会有冲突,需要更改克 ...

  9. Swift类型转换

    关于「类型转换」(Type Casting),<The Swift Programming Language>描述如下: Type casting is a way to check th ...

  10. [HAOI 2012] 外星人

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2749 [算法] 首先 , 每次对一个数x进行操作 , 只会使该数减少一个2的因子 那 ...