leetcode 算法系列 1.两数之和

    技术2022-07-14  137

    1.两数之和

    leetcode题目官方地址:https://leetcode-cn.com/problems/two-sum/ github地址:https://github.com/suggers-7F/leetcode_test. 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例如下: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

    class Solution(): # 比较笨的办法,通过暴力循环去寻找对应的解法,缺点就是消耗时间太长,时间复杂度为0(n²) ,空间复杂度O(1) def twoSum(self,nums,target): for i in range(0,len(nums)): for j in range(i+1,len(nums)): if nums[i] + nums[j] == target: return [i,j] # 复制一个新的数组进行排序,然后通过首尾相加来和目标值对比,通过空间换时间的方式来解决速度问题 # 这里先将数组排序好时间复杂度O(nlogn),空间复杂度O(n),再利用双指针法遍历一遍时间复杂度O(n),空间复杂度O(1)得到结果。 # 为了保存下标信息另开了一个数组 # 所以总共是时间复杂度O(nlogn),空间复杂度O(n) def twoSum_1(self, nums, target): # 数组的浅拷贝 temp = nums.copy() # 数组排序 temp.sort() i = 0 # 定义首位指针 j = len(nums) - 1 # 定义末尾指针 # 如果首位指针大于等于末尾指正跳出循环(这道题给定了一定的初始条件,就是必有解,所以基本不会通过while的条件语句跳出循环) while i < j: # 首位和末尾相加大于目标值,则末尾指针向前移动 if (temp[i] + temp[j]) > target: j = j - 1 # 首位和末尾相加小于目标值,则首位指针向后移动 elif (temp[i] + temp[j]) < target: i = i + 1 # 如果相等等于找到目标值,跳出循环 else: break # 调用数组的index方法找出具体的位置(index只能找到第一个出现的位置) p = nums.index(temp[i]) # 如果答案是不同位置相同的值,需要取出一下,否则直接执行下一个index,还是取到第一个坐标,例如target=6 nums=[3,3] nums.pop(p) k = nums.index(temp[j]) # 因为pop过,所以k要去+1 判断k >=p 其实可以省略。因为题目说必有解,所以最特殊的情况也是k=p if k >= p: k = k + 1 return [p, k] # hash法 利用undered_map数组构造映射,遍历nums[i]时,看target - nums[i]是否存在hash表中即可 # 时间复杂度O(n),空间复杂度O(n) def twoSum_2(self, nums, target): hashset = {} for i in range(len(nums)): if hashset.get(target - nums[i]) is not None: return [hashset.get(target - nums[i]), i] hashset[nums[i]] = i
    Processed: 0.008, SQL: 9