119:杨辉三角Ⅱ
题目描述:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
思路:
只需要保存上一层的结果,就可以求出当前层的结果了。
代码:
for i in range(rowIndex+1):
now=[1]*(i+1)
for j in range(1,i):
now[j]=last[j-1]+last[j]
last=now
return now
121:买卖股票的最佳时机
题目描述:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
思路:
动态规划
目前最小价格 = Min{当天价格,目前最小价格}, 目前最大收益 = Max{当天价格 - 目前最小价格, 目前最大收益}
前i天的最大收益 = max{前i-1天的最大收益,第i天的价格-前i-1天中的最小价格}
用两个变量,一个存储当前最大的收益,一个存储当前的最小值
假定最大利润为0
假定第一个值为最小值
比较之前最小值和当前值,更新最小值
比较之前最大利润和当前利润,更新最大利润
代码:
if len(prices)==0:
return 0
maxprice=0
minprice=prices[0]
for i in range(1,len(prices)):
maxprice=max(maxprice,prices[i]-minprice)
minprice=min(minprice,prices[i])
return maxprice
122:买卖股票的最佳时机Ⅱ
题目描述:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
思路:
1:贪心算法,一次遍历,只要今天价格小于明天价格就在今天买入然后明天卖出。
2:DP动态规划,第i天只有两种状态,不持有或持有股票,当天不持有股票的状态可能来自昨天卖出或者昨天也不持有,同理,当天持有股票的状态可能来自昨天买入或者昨天也持有中,取最后一天的不持有股票状态就是问题的解
代码:
profit=0
for i in range(1,len(prices)):
if prices[i-1]<prices[i]:
profit+=prices[i]-prices[i-1]
return profit
125:验证回文串
题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
思路:
提取有效字符,首尾对比
代码:
s1=list(s)
s2=[]
for i in s1:
if 'A'<=i<='Z' or 'a'<=i<='z' or '0'<=i<='9':
s2.append(i)
if len(s2)<=1:
return True
s3=list(reversed(s2))
for i in range(len(s2)):
if ('A'<=s2[i]<='Z' or 'a'<=s2[i]<='z') and ('A'<=s3[i]<='Z' or 'a'<=s3[i]<='z'):
if s2[i]!=s3[i] and ord(s2[i])+32!=ord(s3[i]) and ord(s2[i])!=ord(s3[i])+32:
return False
else:
if s2[i]!=s3[i]:
return False
return True
136:只出现一次的数字
题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
思路:
set(2*sum(set(nums))-sum(nums))、排序及循环
什么是异或运算(xor):1 xor 1 = 0, 0 xor 0 = 0, 1 xor 0 = 1, 0 xor 1 = 1
任意数字异或其自身等于0的结论。比如数字5,其二进制是101,那么就有101 xor 101 = 0
任意数字异或0等于其本身
位运算与顺序无关,即a xor b = b xor a, a xor b xor a = a xor a xor b = b
代码:
a = 0
for num in nums:
a = a ^ num
return a
141:环形链表
题目描述:
给定一个链表,判断链表中是否有环。
思路:
1:通过哈希表来存储已经遍历的节点,然后判断下个要遍历的节点是否已经在哈希表里存在:若存在则说明是环,否则直到遍历结束也没有找到,那说明不是环。
2:设置两个指针,一个每次走一步,另一个每次走两步,分别称之为快、慢指针。如果快慢两个指针在一个环形链表里,那么快指针一定会追上慢指针,否则快指针会先走到链表尾部,说明没有环存在。
代码:
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
a=set()
while(head):
if head in a:
return True
else:
a.add(head)
head=head.next
return False
1217:玩筹码
题目描述:
数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。
你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):
将第 i 个筹码向左或者右移动 2 个单位,代价为 0。
将第 i 个筹码向左或者右移动 1 个单位,代价为 1。
返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。
思路:
因为移动2个位置不需要代价,那么奇数位置移到奇数位置不用代价,偶数位置移到偶数位置不用代价,那就分别统计奇数位置和偶数位置的个数,相当于把所有奇数放一起,所有偶数的放一起,然后比较奇数的少还是偶数的少,将少的个数移到多的个数位置上。
代码:
j=0
o=0
for i in chips:
if i%2==0:
o+=1
else:
j+=1
return min(o,j)