NO-001
class Solution:
'''
两数和 哈希
'''
def twoSum(self,nums,target):
dict = {}
for i in range(len(nums)):
v = nums[i]
if target-v in dict:
return dict[target-v],i
dict[v]=i
nums = [3,2,4,8]
target = 6
Solution().twoSum(nums,target)
class Leetcode_Solution(object):
def reverse_7(self,x):
"""
:type x: int
:rtype: int
"""
MAX = 2**31 - 1
min = -1*2**31
if x < 0:
y = -1*int(str(-x)[::-1])
else:
y = int(str(x)[::-1])
if y > Max or y < min:
return 0
return y
def isPalindrome_9(self, x):
renum = 0
if x < 0 or (x % 10 == 0 and x != 0):
return False
while x > renum:
renum = renum * 10 + x % 10
x /= 10
return x == renum or x == renum/10
def romanToInt_13(self, s):
"""
:type s: str
:rtype: int
"""
dic = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
sum = 0
for i in range(len(s)-1):
if dic[s[i]] < dic[s[i+1]]:
sum -= dic[s[i]]
else:
sum += dic[s[i]]
return sum + dic[s[-1]]
def longestCommonPrefix_14(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if len(strs) == 0: # Horizontal scanning/////another way: vertical scanning
return ''
prefix = strs[0]
for i in range(1,len(strs)):
while strs[i].find(prefix) != 0:
prefix = prefix[0:len(prefix)-1]
if prefix == '':
return ''
return prefix
def isValid_20(self, s):
"""
:type s: str
:rtype: bool
"""
'''
list = []
a = b = c = 0
if len(s) == 0:
return True
for i in range(len(s)):
if s[i] == '(':
list.append(s[i])
a += 1
if s[i] == '{':
list.append(s[i])
b += 1
if s[i] == '[':
list.append(s[i])
c += 1
if s[i] == ')':
if len(list) != 0 and list[-1] == '(':
list.pop()
a -= 1
else:
return False
if s[i] == '}':
if len(list) != 0 and list[-1] == '{':
list.pop()
b -= 1
else:
return False
if s[i] == ']':
if len(list) != 0 and list[-1] == '[':
list.pop()
c -= 1
else:
return False
if len(list) == 0 and a == b == c == 0:
return True
else:
return False
'''
dic = {')':'(','{':'}','[':']'}
stack = []
for i in s:
if i in dic.values():
stack.append(i)
elif i in dic.keys():
if stack == [] or dic[i] != stack.pop():
return False
else:
return False
return stack == []
def mergeTwoLists_21(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
head = rear = ListNode(0)
while l1 and l2:
if l1.val < l2.val:
rear.next = l1
l1 = l1.next
else:
rear.next = l2
l2 = l2.next
rear = rear.next
rear.next = l1 or l2
return head.next
def removeDuplicates_26(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 0:
return 0
newtail = 0
for i in range(1,len(nums)):
if nums[i] != nums[newtail]:
newtail += 1
nums[newtail] = nums[i]
return newtail + 1
def removeElement_27(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = len(nums)
j = 0
if i == 0:
return 0
while j < i:
if nums[j] == val:
nums.pop(j)
i -= 1
else:
j += 1
return len(nums)
def strStr_28(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
for i in range(len(haystack) - len(needle) +1):
if haystack[i:i+len(needle)] == needle:
return i
return -1
def searchInsert_35(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
return len([x for x in nums if x < target])
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
第一遍刷题的时候过得速度比较快,因为我觉得基础不好的我,不要硬着头皮去想最优的方法,而是应该尽量去学一些算法思想,所以每道题只给自己5-10分钟的时间想,想不出来的就去找相关的答案,所以刷的比较快。
我的github连接:https://github.com/princewen/leetcode_python
1、Two Sum

Two Sum.png
这道题的解题思路很简单,利用python中的字典记录记录下每个元素出现的位置,也就是其他语言中的哈希表。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dic = dict()
for index,value in enumerate(nums):
sub = target - value
if sub in dic:
return [dic[sub],index]
else:
dic[value] = index
26、Remove Duplicates from Sorted Array

Remove Duplicates from Sorted Array.png
这道题要注意的是,不仅要返回不同元素的个数,而且要保证这n个数按照元顺序在数组的前n个位置,也不难,只要按顺序遍历一遍数组即可。
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 0
index = 0
for i in range(1, len(nums)):
if nums[i] != nums[index]:
index = index + 1
nums[index] = nums[i]
return index + 1
27、Remove Element

Remove Element.png
思路同上一题,遍历一遍数组即可
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
index = 0
for i in range(0,len(nums)):
if nums[i] != val:
nums[index] = nums[i]
index = index + 1
return index
35、Search Insert Position

Search insert position.png
对于排好序的数组进行插入的问题,为了减小算法的时间复杂度,很容易想到用二分查找的方法:
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0
right = len(nums)-1
while left <= right:
mid = (right - left) / 2 + left
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return left
53、Maximum Subarray

Maximum Subarray.png
这道题跟之前我在网易面试的股票买卖问题类似,采用的叫Kadane's Algorithm的方法,用两个指针。maxSum指针记录此前所有碰到的最大值,curSum指针记录循环到当前元素这一轮的最大值。当循环到元素i时,如果i+curSum < i的话,说明此前的和是负的,需要舍弃,所以将curSum的值变为i,反之,将curSum的值变为i+curSum,表明当前的和还是正值,可以继续向前探索,由于每一次遍历一个元素之后都会比较一下curSum和maxSum,所以可以放心的继续向前遍历。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]

:rtype: int
"""
curSum=maxSum=nums[0]
for i in range(1,len(nums)):
curSum = max(nums[i],curSum+nums[i])
maxSum = max(curSum,maxSum)
return maxSum
66、 Plus One

Plus One.png
本来想的是从最后一位,找一个记录当前进位的变量,然后遍历一遍数组,后来看了答案,是利用字符串和int的转换做的,解法如下:
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
sum = 0
for i in digits:
sum = sum * 10 + i
return [int(x) for x in str(sum+1)]
88、Merge Sorted Array

Merge Sorted Array.png
这道题很自然的想法就是从后往前遍历两个数组,然后把对应的元素放在数组1对应的位置,唯一需要注意的是最后我们只需判断数组2有没有遍历完即可,因为数组1没有遍历完的话,它已经是按顺序放在前面的了:
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: void Do not return anything, modify nums1 in-place instead.
"""
while m > 0 and n > 0:
if nums1[m - 1] > nums2[n - 1]:
nums1[m + n - 1] = nums1[m - 1]
m = m - 1
else:
nums1[m + n - 1] = nums2[n - 1]
n = n - 1
if n > 0:
nums1[:n] = nums2[:n]
118、Pascal's Triangle

Pascal's Triangle.png
著名的杨辉三角问题,本来想用笨办法,一行一行的循环生成,但是看到解题思路中一种比较独特的思路:
1 3 3 1 0
- 0 1 3 3 1
= 1 4 6 4 1
代码如下:
class Solution(object):
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
if numRows == 0:return []
res = [[1]]
for i in range(1,numRows):
res.append(map(lambda x,y:x+y,res[-1]+[0],[0]+res[-1]))
return res
119、Pascal's Triangle II

Pascal's Triangle II.png
按照上一题的思路即可:
class Solution(object):
def getRow(self, rowIndex):
"""
:type rowIndex: int
:rtype: List[int]
"""
res = [1]
for i in range(1, rowIndex + 1):
res = list(map(lambda x, y: x + y, res + [0], [0] + res))
return res
121、Best Time to Buy and Sell Stock

Best Time to Buy and Sell Stock.png
类似于53题的思路,使用Kadane's Algorithm:
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
curSum=maxSum=0
for i in range(1,len(prices)):
curSum=max(0,curSum+prices[i]-prices[i-1])
maxSum = max(curSum,maxSum)
return maxSum
122、Best Time to Buy and Sell Stock II

Best Time to Buy and Sell Stock II.png
这道题比较简单,因为没有买卖次数限制,也没有买卖时间限制,如果后面的股价比前面的大,我们就买卖
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
return sum(max(prices[i+1]-prices[i],0) for i in range(len(prices)-1))
167、Two Sum II - Input array is sorted

Two Sum II - Input array is sorted
仍然可以使用第一题的思路:
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
res = dict()
for i in range(0,len(numbers)):
sub = target - numbers[i]
if sub in res.keys():
return [res[sub]+1,i+1]
else:
res[numbers[i]] = i
return []
微信 sxw2251
链接:https://www.jianshu.com/p/b71fc7307e42
來源:简书