leetcode日常总结三

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值