1.两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。假设每个输入只对应一种答案,且同样的元素不能被重复利用。
举例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路:利用python中的字典记录下数组中每个元素的值和其对应的索引坐标,也就是其他语言中的哈希表、散列表。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dic = dict() #建立一个空字典,也可以写成dic={}
for index, value in enumerate(nums):
sub = target - value
if sub in dic:
return [dic[sub], index]
else:
dic[value] = index #存储数组nums中的值和其对应的索引坐标
if __name__ == '__main__':
nums = [2, 7, 11, 15]
print(type(nums))
target = 9
result = Solution().twoSum(nums, target)
print(result)
2.删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
例1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
例2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
思路:依据题目和例子,不能使用额外的数组,且输入数组的规律是相邻着的有重复元素。通过遍历相邻两个元素比较,然后移除相同的元素就可。
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
i = 0
while i < len(nums) - 1:
if nums[i] == nums[i + 1]:
nums.remove(nums[i])
#nums.pop(i)
else:
i += 1
return len(nums)
if __name__ == '__main__':
nums = [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]
print(Solution().removeDuplicates((nums)))
print(nums)
3.删除排序数组中的重复项
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
示例2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
思路:依据题目和例子,不能使用额外的数组。可以先进行数组遍历,记录重复元素的个数,在执行移除操作。
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
count=0
for i in range(len(nums)):
if nums[i]==val:
count =count +1
for j in range(count):
nums.remove(val)
return len(nums)
if __name__ == '__main__':
nums = [0,1,2,2,3,0,4,2] #
print(Solution().removeElement(nums,2))
print(nums)
4.搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
示例1:
输入: [1,3,5,6], 5
输出 2
示例2:
输入: [1,3,5,6], 2
输出: 1
思路:先搜索目标值在不在列表中,如果不在,先插入列表,然后再排序,最后返回目标值索引。
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
for i in range(len(nums)):
if nums[i] == target:
return i
else:
nums.append(target)
nums.sort()
return nums.index(target)
if __name__ == '__main__':
nums = [2, 3, 4, 7,8,9]
target =11
print(Solution().searchInsert(nums,target))
5.最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
class Solution():
def maxSubArray(self, nums):
for i in range(1,len(nums)):
nums[i]=max(nums[i],nums[i]+nums[i-1])
return max(nums)
if __name__ == '__main__':
nums = [-2,1,-3,4,-1,2,1,-5,4]
print(Solution().maxSubArray(nums),nums)
6.加一
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
思路:这题只要注意三种数字组合,如:9、99、1299。
方法1:
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
if digits[-1] == 9 and len(digits) == 1:
digits[-1] = 0
digits.insert(0, 1)
return digits
if digits[-1] != 9 or len(digits) == 1:
digits[-1] = digits[-1] + 1
return digits
digits[-1] = 0
i = 2
while True:
if digits[-i] == 9 and len(digits) > i:
digits[-i] = 0
i += 1
elif digits[-i] == 9 and len(digits) == i:
digits[-i] = 0
digits.insert(0, 1)
return digits
else:
digits[-i] += 1
return digits
if __name__ == '__main__':
# digits = [1,2,3,4]
# digits = [1, 2, 9, 9]
# digits = [9]
digits = [9, 9]
print(Solution().plusOne(digits))
方法2:列表转字符串,字符串转数字进行四则运算
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
a=""
for i in digits:
a+=str(i)
a=int(a) + 1
b=[]
for i in str(a):
b.append(int(i))
digits = b
return digits