算法思想
1.两数之和
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路一
定义一个索引i
遍历出nums
中的元素,判断列表中是否有符合 target - nums[i]
的值,有的话返回对应值的索引sums.index(target - sums[i])
class Solution():
def twoSum(self, nums, target):
for i in range(len(nums)):
if (target - nums[i]) in nums:
j = nums.index(target-nums[i])
if i == j: # 判断两次索引是否代表同一个值
continue # 代表值相同 开始下一次循环
else:
return [i, j] # 返回结果
else: # 值如果只不在sums里 则开始下一个循环
continue # pass
思路二
构建空字典,用去重的方法返回对应索引 # 列表同样可以
class Solution:
def twoSum(self, nums, target):
dic = {} # 构建一个空字典用来存储数据
lens = len(nums) # nums的长度
for i in range(lens): # 遍历nums列表
if target - nums[i] not in dic: # 往空字典里添加 target-nums[i]
dic[nums[i]] = i # 第一个 正确值 对应的 索引
else: # 如果值已经存在 则返回第一次出现的 值的索引 和 当前索引
return [dic[target - nums[i]], i]
class Solution:
def twoSum(self, nums, target):
list1 = []
lens = len(nums)
for i in range(lens):
if target-nums[i] not in list1:
list1.append(nums[i])
else:
return [list1.index(target-nums[i]), i]
2.平方数之和
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a² + b² = c。
输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5
思路一
根据勾股定理 a 和 b都是要小于 < c******0.5(根号c),首先两个数必须要 属于 这个非负整数,可以用两个指针从0
开始遍历 非负整数, 一个(0, c+1) 另一个(i, c+1)
ps 两个数可以重复 比如 1
和 2
class Solution1: # 好的超时了,我们换一个 枯了....
def judgeSquareSum(self, c):
for i in range(0, int(c**0.5+1)):
for j in range(i, int(c**0.5+1)):
if i ** 2 + j ** 2 == c:
return True
思路二
同理,a和b都小于根号c,首先遍历(0, int(c0.5+1)),再判断(c-i²)½ 的 数据类型 与 (c-i²)½ 是否相同
注意:这里不能直接根据数据类型是不是整形来判断,因为生成的result值是 float 整形也会以浮点型的方式表现出来 比如 result == 1
返回的是 1.0
class Solution1:
def judgeSquareSum(self, c):
for i in range(0, int(c**0.5)+1):
result1 = (c-i*i)**0.5
print(result1) # 2.0
if isinstance(result1, int) == True:
return True
result = Solution1()
print(result.judgeSquareSum(c=4))
class Solution1:
def judgeSquareSum(self, c):
for i in range(0, int(c**0.5)+1):
result1 = (c-i*i)**0.5
if int(result1) == (c-i*i)**0.5: # if int((c-i*i)**0.5) == (c-i*i)**0.5:
return True
if int(result1) == (c-i*i)**0.5: # if int((c-i*i)**0.5) == (c-i*i)**0.5:
return True