两数之和(python)

题目

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例

输入:nums = [3,2,4], target = 6

输出:[1,2]

解法1:暴力枚举

伪代码

下标x和从下标x之后的数,计算两者之和比较target值

python代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        ans=[]
        for i in range(len(nums)):
            for j in range(i,len(nums)):
                if nums[i]+nums[j]==target:
                    s=[i,j]
                    if s[0]!=s[1]:
                        ans.append(s)
        return ans[0]
   

解法2:哈希表

伪代码

两个元素x,y必然是一前一后出现的,如果存在符合条件的解,在遍历到x时,哈希表里没有符合的y,此时把x加入到了哈希表里,当遍历到y时,就可以在哈希表里找到对应的x了,所以只需要一次遍历

python代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        ans=[]
        i=0
        while i<len(nums):
            if target-nums[i] not in ans:
                ans.append(nums[i])
            else:
                x=ans.index(target-nums[i])
                y=i
                return [x,y]
            i+=1

哈希表在数组查找元素的应用很常见

合并两个有序数组

题目

给你两个按 非递减顺序 排列的整数数组 nums1 nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

示例

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3

输出:[1,2,2,3,5,6]

解释:需要合并 [1,2,3] 和 [2,5,6] 。

合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

解法1:直接合并然后排序

python代码

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        for i in range(n):
            nums1.pop()
        for i in range(n):
            nums1.append(nums2[i])
        nums1.sort()
        
    

解法2:双指针

伪代码

利用两个数组都是非递减整数排列

python代码

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        p1=0
        p2=0
        ans=[]
        while p1<m or p2<n:
           
            if p1==m:
                ans.append(nums2[p2])
                p2+=1
            elif p2==n:
                ans.append(nums1[p1])
                p1+=1
            elif nums1[p1]<=nums2[p2]:
                ans.append(nums1[p1])
                p1+=1
            elif nums1[p1]>nums2[p2]:
                ans.append(nums2[p2])  
                p2+=1  
        for i in range(m+n):
            nums1[i]=ans[i]
        
    

解法3:逆向双指针

伪代码

nums1后半段是空的,可直接覆盖不影响

事实上,在这个遍历的任何时刻,nums1有m-p1-1个元素放如nums1后半段,nums2有n-p2-1个元素放入nums1后半段,nums1后半段的空间m+n-p1-1

任何时刻都是成立的

python代码

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        p1=m-1
        p2=n-1
        i=0
        while p1>=0 or p2>=0:
           
            if p1==-1:
                nums1[m+n-1-i]=nums2[p2]
                p2-=1
            elif p2==-1:
                nums1[m+n-1-i]=nums1[p1]
                p1-=1
            elif nums1[p1]>=nums2[p2]:
                nums1[m+n-1-i]=nums1[p1]
                p1-=1
            elif nums1[p1]<nums2[p2]:
                nums1[m+n-1-i]=nums2[p2]  
                p2-=1  
            i+=1
    

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值