leetcode 题库解答

 
 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] ![Plus One.png](//upload-images.jianshu.io/upload_images/4155986-52d077924ae34aff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) :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
來源:简书
 

转载于:https://www.cnblogs.com/koafan-zou/p/9327006.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值