升序数据中找到二元组为固定之和

1:题目描述

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

 

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:

输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2:题目分析

  这是一道找到目标和二元组的数组问题,暴力方法时间复杂度很高,我们不得不遍历n^2的次数才能找到目标二元组,但是如果我们能够利用好给的条件的话,那么这道题将很简单!题目中说明数组是递增的,那么如何利用尼?

  我们可以固定数组中最大值和最小值,如果这两个之和大于目标值,说明最大值太大了,只能取次大值;如果这两个之和小于目标值,说明这两个数太小了,只能增大较小值,为什么不能说增加较大值尼?因为较大值就是从右向左过来的,如果能通过增加较大值带到之和等于目标值,则之前过程就会出现过了!

3:代码示例

package JianZhiOffer57;

import java.util.Arrays;

/**
 * @author :dazhu
 * @date :Created in 2020/4/13 11:15
 * @description:升序数据中找到固定之和
 * @modified By:
 * @version: $
 */
public class Main {
    public static void main(String[] args) {
        int[] array = new int[]{10,26,30,31,47,60};
        int tatget = 40;
        Solution solution = new Solution();
        System.out.println(Arrays.toString(solution.twoSum(array,tatget)));
    }
}
class Solution {
    //解题思路
    //首先取出数组首部和尾部的二元组进行判断,二元组之和大于目标值则将第二个元素左移,
    //二元组元素之和小于目标值,则第一个元素右移,直到出现相等即可!
    //这样不会错过,因为只要大于目标值,则只能将第二个元素左移,如果将第一个元素左移,则不可能满足等于目标值
    //因为第一个元素就是从左向右移到,如果能得到目标值则之前已经得到啦!!!
    public int[] twoSum(int[] nums, int target) {
        int leftIndex = 0;
        int rightIndex = nums.length-1;

        int leftNum =0;
        int rightNum =0;
        int sumTemp=0;

        while(true){
            //leftInex>rightIndex意味着全部找到了,也没找到,则要break;
            if(leftIndex>rightIndex){
                break;
            }
            leftNum = nums[leftIndex];
            rightNum = nums[rightIndex];
            sumTemp = leftNum+rightNum;
            //如果正好找到了,则直接break
            if(sumTemp==target){
                break;
            }
            //如果之和大于target,rightNum进行左移
            if(sumTemp>target){
                rightIndex--;
            }
            //如果之和小于target,leftNum进行右移
            if(sumTemp<target){
                leftIndex++;
            }
        }
    return new int[]{leftNum,rightNum};
    }
}

 

posted @ 2020-04-13 11:39  大朱123  阅读(184)  评论(0编辑  收藏  举报