第14题:查找升序数组中的两数,使其和为输入数字

欢迎转载,转载请注明出处:http://blog.csdn.net/alading2009/article/details/45080773

第14题:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求: 时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

两头向中间靠拢,因为是升序数组,两数之和大了就尾指针前移,两数之和小了就头指针后移。

代码

package test014;

/**
 * Created by cq on 2015/4/16.
 * 第14题:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
 * 要求:  时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
 * 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
 */
public class Test014 {
    public static String getPair(int[] arr, int k){
        if (arr == null || arr[0] >= k){
            return null;
        }

        int head = 0, tail = arr.length-1;

        //如果尾上的值比k大,则尾指针前移,直到到达一个比k小的值
        while (head < tail && arr[tail] >= k){
            tail--;
        }

        //从数组的两头向中间扫描,最差情况下整个数组被扫描一遍
        while (head < tail){
            if (arr[head] + arr[tail] == k){
                return arr[head]+" "+arr[tail];
            }
            else if (arr[head] + arr[tail] > k){
                tail--;
                continue;
            }
            else
                head++;
        }

        return null;
    }
    public static void main(String[] args){
        int[] arr = {1,2,4,7,11,15};
        System.out.println("数组中和为15的两数为:"+getPair(arr,15));
        System.out.println("数组中和为19的两数为:"+getPair(arr,19));
        System.out.println("数组中和为21的两数为:"+getPair(arr,21));
    }
}

执行结果

Connected to the target VM, address: ‘127.0.0.1:28571‘, transport: ‘socket‘
数组中和为15的两数为:4 11
数组中和为19的两数为:4 15
数组中和为21的两数为:null
Disconnected from the target VM, address: ‘127.0.0.1:28571‘, transport: ‘socket‘

Process finished with exit code 0
时间: 2024-07-29 07:23:17

第14题:查找升序数组中的两数,使其和为输入数字的相关文章

剑指Offer(Java版)第四十题:在数组中的两个数字,如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。 并将P对1000000007取模的结果输出。 即输出P%1000000007

/*在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 */ import java.util.*; public class Class40 { public int InversePairs(int[] array){ int length = array.length; int P = 0; for(int i = 0; i < lengt

leetcode之数组中找两数和为指定值

题目: Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note t

一个数组中只有两个数是不同的,其他数字是成对出现的,下面代码可将该数组中不同的两数字找出并输出

#include<stdio.h>int main(){ void function(int * str, int size, int *p1, int *p2); int i = 0; int num1 = 0, num2 = 0; int arr[10] = {0}; int len = sizeof(arr) / sizeof(arr[0]); for (i = 0; i < len; i++) {  scanf("%d", &arr[i]); }  f

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

快速查找无序数组中的第K大数?

1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高效算法. 还记得我们快速排序的思想麽?通过“partition”递归划分前后部分.在本问题求解策略中,基于快排的划分函数可以利用“夹击法”,不断从原来的区间[0,n-1]向中间搜索第k大的数,大概搜索方向见下图: 2.参考代码: 1 #include <cstdio> 2 3 #define sw

程序员面试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).这个算法很简

查找一个数组中最小的前n项

/****************************************************************** find the biggest x number in a sequence* the basic method is the same as the QuickSort** 1. move the smaller one before the pivot* 2. move the bigger one after the pivot* 3. determin

每日一题16:在一个数组中实现两个栈

在一个数组中实现两个栈,当数组未填满是任一个栈不能溢出.解法是将一个栈从头开始往后插入,而另一个从后往前插入,如果插入一个元素后,两个栈的top指针未相遇,则表示数组未满,栈没有溢出. #include "stdafx.h" #include <iostream> using namespace std; struct special_stack { int capcity; int ltop,rtop; int* vals; }; special_stack* creat

输出 一维数组中最大的数+数组遍历

1 //将数组中最大的数输出 2 //数组遍历 3 int[] arr = new int[]{2,4,1,6,10,11}; 4 System.out.println("输出一维数组 :"); 5 for(int i=0; i<arr.length;i++) 6 { 7 System.out.print(arr[i]+" "); 8 } 9 10 System.out.println(); 11 12 int max = arr[0]; 13 for(int