leetcode1——两数之和

本文探讨了在给定数组中寻找两个数使它们的和等于目标值的问题,提出了一种优于双层循环的解决方案,通过快速排序和双指针技巧,将时间复杂度从O(n^2)优化至O(nlogn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间和空间复杂度参考博客:https://blog.youkuaiyun.com/jsjwk/article/details/84315770

                                                   https://www.jianshu.com/p/1ac6ad4069f8

时间复杂度:考虑最高的,比如n^2+n,那它的时间复杂度就是n^2

空间复杂度:看辅助变量(一些常量)占用的临时内存

 

题目:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

思路:在做题中,先想到一般的方法两个for循环算法复杂度为n^2,但是可以把复杂度降低为nlog(n),首先采用快排将无序的数组变成有序数组,然后设置left,right两个指针,直到找到nums[left]+nums[right]=target为止,这样找的过程中复杂度为n,因此最终的算法复杂度为nlog(n).一定要思考什么时候结束循环,当left=right的时候结束,因为我们是要找两个数加起来等于target,因此 while left<right.

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]: 
        if nums is None or len(nums) <= 1:
            return None
        nums_index_pairs = [(num, index) for index,num in enumerate(nums)]
        nums_index_pairs.sort()
        begin = 0
        end = len(nums)-1
        while begin < end:
            now_sum = nums_index_pairs[begin][0] + nums_index_pairs[end][0]
            if now_sum == target:
                return [nums_index_pairs[begin][1], nums_index_pairs[end][1]]
            if now_sum > target:
                end -= 1
            else:
                begin += 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值