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}; } }
原文地址:https://www.cnblogs.com/dazhu123/p/12690314.html
时间: 2024-10-15 02:27:16