首页 > 其他分享 >两数之和-输出有序数组

两数之和-输出有序数组

时间:2024-02-03 23:26:52浏览次数:30  
标签:target int 数组 numbers 有序 index2 index1 两数

167 Two Sum II - Input array is sorted

问题描述:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释:
2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
//几个问题
//1、**如果没有解如何处理**? 题目保证有解
//2、**如果有多个个如何处理**? 返回任意一组即可
//3、**索引是从0开始还是从1开始**? 索引从1开始
//思路一:
// 数组有序,首先想到二分查找,对于nums[i],如果数组中存在两个元素和为target,
// 则必然在nums[i+1...n-1]中存在元素target-nums[i]。
public int[] twoSum(int[] numbers, int target) {
    for(int i=0;i<numbers.length;i++){
        int index=binarySearch(numbers,target-numbers[i],i+1,numbers.length-1);
        if(index!=-1){
            //说明[i+1...n-1]存在元素target-numbers[i]
            return new int[]{i+1,index+1};
        }
    }
    return null;
}

public int binarySearch(int[] numbers,int target,int l,int r){
    while(l<=r){
        int mid=(r-l)/2+l;
        if(numbers[mid]==target){
            return mid;
        }else if(numbers[mid]<target){
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    return -1;
}
//时间复杂度 O(nlogn)
//空间复杂度 O(1)
//思路二:
//引入两个指针 i,j,分别指向该有序数组的头部和尾部:
//当numbers[i]+numbers[j]==target时, i、j就是所求的解
//当numbers[i]+numbers[j]<target时,说明值过小,要加大值,i加1
//当numbers[i]+numbers[j]==target时,说明值过大,要减小值,j减1

public int[] twoSum(int[] numbers, int target) {
    int i=0;
    int j=numbers.length-1;
    while(i<j){
        //i和j是不能相等的,因为反返回两个不同下标
        int sum=numbers[i]+numbers[j];
        if(sum==target){
            return new int[]{i+1,j+1};
        }else if(sum<target){
            i++;
        }else{
            j--;
        }
    }
    return null;
}
//时间复杂度:O(n)
//空间复杂度:O(1)

参考:

标签:target,int,数组,numbers,有序,index2,index1,两数
From: https://www.cnblogs.com/i9code/p/18005385

相关文章

  • 合并两个有序数组
    88.合并两个有序数组问题描述:给定两个有序整数数组nums1和nums2,将nums2合并到nums1中,使得num1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n。你可以假设nums1有足够的空间(空间大小大于或等于m+n)来保存nums2中的元素。示例:输......
  • synchronized【如何保证原子性、可见性、有序性】【如何实现原子性 原理解析】【什么
    @TOC转自极客时间如何解决可见性问题?同步原理剖析什么是Monitor?什么是锁优化?......
  • volatile源码解析【解决可见性(依据happened-befor)有序性(依据内存屏障)】
    @TOC转自极客时间解决内存可见性问题volatile实现原理-源码分析......
  • 获取数组中元素的所有组合方式
    代码/***获取words成员的所有组合方式*@param{(string|number)[]}words*@return{(string|number)[][]}*/functioncombine(words){constlist=[]words.forEach((word,idx)=>{constrestWords=[...words.slice(0,idx),...words.slice(......
  • 「KDOI-03」构造数组
    「KDOI-03」构造数组题目描述你现在有一个长度为\(n\)的数组\(a\)。一开始,所有\(a_i\)均为\(0\)。给出一个同样长度为\(n\)的目标数组\(b\)。求有多少种方案,使得通过若干次以下操作,可以让\(a\)数组变成\(b\)。选出两个不同的下标\(1\leqi<j\leqn\),并将\(a_i\)......
  • 2024-02-03:用go语言,你有 k 个背包。给你一个下标从 0 开始的整数数组 weights, 其中 we
    2024-02-03:用go语言,你有k个背包。给你一个下标从0开始的整数数组weights,其中weights[i]是第i个珠子的重量。同时给你整数k,请你按照如下规则将所有的珠子放进k个背包。没有背包是空的。如果第i个珠子和第j个珠子在同一个背包里,那么下标在i到j之间的所有珠......
  • 数组的中心位置-od-python
    数组的中心位置时间限制:1s空间限制:256MB限定语言:不限题目描述:给你一个整数数组nums,请计算数组的中心位置。数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。数组第一个元素的左侧积为1,最后一个元素的右侧积为1如果数组有多个中心位置,应该返回......
  • 力扣 34. 在排序数组中查找元素的第一个和最后一个位置
    Problem: 34.在排序数组中查找元素的第一个和最后一个位置思路找到大于等于target的下标,然后遍历之后的数组,找到最后的下标。classSolution{public:intf(vector<int>&nums,inttarget){intl=0,r=nums.size()-1;intmid=floor(l+(r-l)*1.0/2);......
  • flat 拍平数组 手写flat拍平数组
    //flat拍平一维数组letflaoatArr=[1,3,5,6,3,6,[3,46,465,3]]letres=flat(flaoatArr)console.log(res);letres=flaoatArr.flat()console.log(res);//手写float数组Array.protot......
  • JAVA数组练习代码
    一维数组的有序插入思路代码点击查看代码importjava.util.Scanner;/***@authorLittleBear*@date2024-02-02-16:57*/publicclassseqInsertion{publicstaticvoidmain(String[]args){System.out.println("pleaseinputyournum:");......