美文网首页
hihocoder - towsum问题(三解)

hihocoder - towsum问题(三解)

作者: 掌灬纹 | 来源:发表于2019-01-28 20:51 被阅读0次

描述

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。你需要输出这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。

你可以假设数组递增有序。

输入

第一行:N个整数,作为数组的元素,空格分开

第二行:target

输出

两个下标,空格隔开。如有多组满足要求,输出靠前的一组。

样例输入

4

2 7 11 15

9

样例输出

0 1

思路:

1.暴力法 O(n^2) (双重for循环,不多说了)

2.二分法O(nlgn)

当前数组元素x,和sum,转为对目标sum-x二分法寻找

3.双指针扫描法

头尾指针,向中间移动扫描。

(Java代码参考如下)

/**

* O(n^2) 暴力法

*/

import java.util.Scanner;

public class Exam12_00 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int[] arr = new int[n];

for(int i = 0; i < arr.length; i++) {

arr[i] = sc.nextInt();

}

int target = sc.nextInt();

for(int i = 0; i < arr.length; i++) {

for(int j = 0; j < arr.length; j++) {

int sum = arr[i] + arr[j];

if(sum == target&&i != j) {

System.out.println(i + " " + j);

return;

}

}

}

}

}

/**

* O(nlgn)

* 二分法变种

* 当前x 转为求 target - x 在递增数组中的位置 有则返回 两数小标

* 无则x 后移

*/

import java.util.Scanner;

public class Exam12_01 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int[] arr = new int[n];

for(int i = 0; i < arr.length; i++) {

arr[i] = sc.nextInt();

}

int sum = sc.nextInt();

for(int i = 0; i < arr.length ; i++) {

int target = sum - arr[i];

if(binaryRearch(arr, target)!= -1

&& i != binaryRearch(arr, target)) {// =-1没有找到

System.out.println(i + " " + binaryRearch(arr, target));

return;

}

}

}

static int binaryRearch(int[] arr, int target) {

int begin = 0;

int end = arr.length - 1;

while(begin < end) {

int midIndex = begin + ((end - begin)>>1);

if(arr[midIndex] > target) {

end = midIndex - 1;

}else if(arr[midIndex] < target) {

begin = midIndex + 1;

}else {

return midIndex;

}

}

return -1;

}

}

/**

* 双向指针扫描

**/

import java.util.Scanner;

public class Exam12_02 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int[] arr = new int[n];

for(int i = 0; i < arr.length; i++) {

arr[i] = sc.nextInt();

}

int target = sc.nextInt();

int head = 0;//头指针

int tail = arr.length-1;//尾指针

while(head < tail) {//没有找到

int sum = arr[head] + arr[tail];

if(sum > target) {

tail--;

}else if(sum < target) {

head++;

}else {

System.out.println(head + " " + tail);

return;

}

}

}

}

相关文章

  • hihocoder - towsum问题(三解)

    描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。你需要输出这两个数的下标, 并且第一个...

  • 数字字符串转为字母组合———动态规划

    来源:《算法与数据结构最优解》左程云著 --hihoCoder练习题 问题描述:给定一个字符串str,str全部由...

  • hihoCoder#1320:压缩字符串

    是一个递归问题,根据讨论区提示,分为三种情况取最短。来自:https://hihocoder.com/discus...

  • hihoCoder简单问题合集

    1135:提补交卡 提取主要信息:得到最长连续天数 在一张补交卡提交之后,总能得到比之前所有连续天数更长的数据。 ...

  • hihocoder 微软相关

    https://hihocoder.com/contest/mstest2015octpractice/probl...

  • 个人清单索引

    个人文章系列 问题解决与设计(草稿) (一)问题情境 (二)可行解 (三)开放问题 (四)纠结与最优解 (五)复杂...

  • hihocoder75

    https://hihocoder.com/contest/offers75/problems 题目1 : 工作城...

  • hihocoder66

    http://hihocoder.com/contest/offers66/problems 题目1 : 最小距离...

  • hihocoder46

    http://hihocoder.com/contest/offers46/problems题目1 : AEIOU...

  • hihocoder67

    http://hihocoder.com/contest/offers67/problems 题目1 : 序列区间...

网友评论

      本文标题:hihocoder - towsum问题(三解)

      本文链接:https://www.haomeiwen.com/subject/icezjqtx.html