【算法】Two Sum II - Input Array Is Sorted 两数之和 II - 输入有序数组

这篇具有很好参考价值的文章主要介绍了【算法】Two Sum II - Input Array Is Sorted 两数之和 II - 输入有序数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Two Sum II - Input Array Is Sorted 两数之和 II - 输入有序数组

问题描述:

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

2 < = n u m b e r s . l e n g t h < = 3 ∗ 1 0 4 − 1000 < = n u m b e r s [ i ] < = 1000 n u m b e r s 按非递减顺序排列 − 1000 < = t a r g e t < = 1000 仅存在一个有效答案 2 <= numbers.length <= 3 * 10^4\\ -1000 <= numbers[i] <= 1000\\ numbers 按 非递减顺序 排列\\ -1000 <= target <= 1000\\ 仅存在一个有效答案 2<=numbers.length<=31041000<=numbers[i]<=1000numbers按非递减顺序排列1000<=target<=1000仅存在一个有效答案

分析

第一个应该想到的就是暴力,时间复杂度 O ( N 2 ) O(N^2) O(N2).

暴力虽然时间复杂度高,但是绝对可以拿捏,不需要考虑其他特殊情况。

改进

因为原数组是一个规律的有序数组,所以在找另一个数的时候,就可以二分了。时间复杂度 O ( N L o g N ) O(NLogN) O(NLogN).

特点:比较快,但是场景有限制,对编码能力有一定门槛。

再改进:

双指针该方法还是基于有序数组

  • 从2个端点开始找,
  • 如果 s u m = = t a r g e t sum==target sum==target,说明找到了一个合法的pair。
  • 否则 s u m > t a r g e t sum>target sum>target,那就需要把右端点像左移。
  • 如果 s u m < t a r g e t sum<target sum<target,那就需要把左端点向右移。

特点:这个比二分更快,时间复杂度 O ( N ) O(N) O(N),也是对场景有限制。

Two Sum 虽然简单,但是变种太多。如果不是有序的数组,这个时候,就不能直接使用二分和双指针了。

代码

二分

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int n = numbers.length;
        for(int i = 0;i<n; i++){
            int idx = find(numbers,i+1,n-1,target-numbers[i]);
            if(idx!=-1){
                return new int[]{i+1,idx+1};
            }
        }
        return new int[0];
    }

    public int find(int[] arr,int l,int r,int tar){
        int mid = 0;
        while(l<=r){
            mid = l+ (r-l)/2;
            if(arr[mid]== tar) return mid;
            if(arr[mid]>tar) r = mid-1;
            else l = mid+1;
        }        
        return -1;
    }
}

时间复杂度 O ( N log ⁡ N ) O(N\log N) O(NlogN)

空间复杂度 O ( 1 ) O(1) O(1)

双指针

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int l=0,r = numbers.length-1;
        while(l<r){
            int x = numbers[l]+numbers[r];
            if(x== target){
                return new int[]{l+1,r+1};
            }
            if(x>target) r--;
            else l++;
        }
        return new int[0];
    }
}

时间复杂度 O ( N ) O(N) O(N)

空间复杂度 O ( 1 ) O(1) O(1)

Tag

Array

Two pointer

Binary Search文章来源地址https://www.toymoban.com/news/detail-537678.html

到了这里,关于【算法】Two Sum II - Input Array Is Sorted 两数之和 II - 输入有序数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 167. 两数之和 II - 输入有序数组

      给你一个下标从  1  开始的整数数组  numbers  ,该数组已按   非递减顺序排列   ,请你从数组中找出满足相加之和等于目标数  target  的两个数。如果设这两个数分别是  numbers[index1]  和  numbers[index2]  ,则  1 = index1 index2 = numbers.length  。 以长度为 2 的整数数组  [i

    2024年02月16日
    浏览(39)
  • [java]两数之和 II - 输入有序数组

    167. 两数之和 II - 输入有序数组 – 原题链接 题目描述: 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 = index1 index2 = numbers.length 。

    2024年02月06日
    浏览(33)
  • leetcode167 两数之和 II - 输入有序数组

    定义两个指针分别 l , r l,r l , r 指向数组的最小和最大元素,即左右边界,其中 l l l 向右遍历, r r r 向左遍历 当 l , r l,r l , r 指向的两数之和等于target,就是我们要的结果。如果大于target, r − − r-- r − − ,减小一点。如果小于target, l + + l++ l + + ,增大一点 给你一个下

    2024年02月19日
    浏览(40)
  • 【LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月13日
    浏览(38)
  • 算法面试题:Two Sum问题

    问题: 查找数组中的两个数字,使它们的和等于给定的目标值。返回这两个数字的索引。你可以假设每个输入都只有一个解,而且你不能使用相同的元素两次。 示例: 解答: 这个问题是著名的Two Sum问题,它可以通过使用哈希表来解决,时间复杂度为O(n),其中n是数组的长度

    2024年02月07日
    浏览(42)
  • [LeetCode - Python]167.两数之和 II (Medium);125. 验证回文串(Easy)

    167.两数之和 II (Medium) 125. 验证回文串(Easy) 1.自己第一次写: 2.看题解

    2024年02月14日
    浏览(41)
  • Leetcode每日一题:167. 两数之和 II - 输入有序数组(2023.7.8 C++)

    目录 167. 两数之和 II - 输入有序数组 题目描述: 实现代码与解析: 暴力(超时) 双指针 原理思路: 二分 原理思路:         给你一个下标从  1  开始的整数数组  numbers  ,该数组已按   非递减顺序排列   ,请你从数组中找出满足相加之和等于目标数  target  的两

    2024年02月13日
    浏览(47)
  • 【算法】Add Two Numbers 两数相加

    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 每个链表中的节点数在范围

    2024年02月11日
    浏览(46)
  • 【算法Hot100系列】两数之和

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月05日
    浏览(39)
  • 【优选算法专栏】专题九:链表--------两数之和

    本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:算法从入门到精通 🚚代码仓库:小小unicorn的代码仓库

    2024年02月21日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包