Remove Duplicates from Sorted List
从排序链表中删除重复元素。
Description
解题思路:
依次比较相邻的两个链表元素,若值相等,则将前一个节点的next引用为后一个节点的后一个节点。使用cur来依次向下遍历元素,最后返回head。
1 | # Definition for singly-linked list. |
从排序链表中删除重复元素。
Description
解题思路:
依次比较相邻的两个链表元素,若值相等,则将前一个节点的next引用为后一个节点的后一个节点。使用cur来依次向下遍历元素,最后返回head。
1 | # Definition for singly-linked list. |
给定一个排序数组,将数组中的重复元素去除,并返回修改后的数组长度。
Description
解题思路:
题目要求不能分配额外空间,由于python中列表是传引用,因此可以对传入的列表进行原地修改。由于数组已经排序,因此可以通过新建一个下标两两比较删除重复的元素。
注意:
题目中 It doesn’t matter what you leave beyond the new length,因此超出长度部分的重复元素不需要考虑。
1 | def removeDuplicates(self, nums): |
合并两个有序链表。
Description
解题思路:
此题比较简单,采用迭代的方式。由于链表已经是有序的,所以依次比较两个链表当前元素的大小,然后将较小的元素加入到新的链表中。
1 | # Definition for singly-linked list. |
最大子串和问题:从一个数组中找出一个子串使其和最大。
Description
tips:
子串是指数组中连续的若干个元素,而子序列只要求各元素的顺序与其在数组中一致,而没有连续的要求。
解题思路:
自己没有想出来,直接借鉴了网上的动态规划思路,我觉得下面是一些解决的关键点:
1 | def maxSubArray(self, nums): |
最长相同前缀:给定一个字符串数组,找出其中最长的共同前缀。这里leetcode并没有说明共同前缀是指两两之间的前缀还是所有字符串的前缀,实际题意是指采用所有字符串的共同前缀。
Description
解题思路:
若字符串数组为空则返回空字符串;
否则从所有字符串中找出最短的字符串,依次将最短字符串的每个元素和所有字符串对应位置上的元素进行比较,若不同则停止比较并返回;
若全部相同,则返回最短字符串。
1 | if not strs: |
改进:
将字符串数组进行排序(注意,这里是按照字母表顺序排序,而不是根据长度排序),排序后实际只要比较第一个和最后一个字符串的共同前缀即可,因此大大提升了运行时间。1
2
3
4
5
6
7
8
9
10
11
12
13if not strs:
return ""
strs.sort()
first = strs[0]
last = strs[-1]
minlen = min(len(first), len(last))
for i in range(minlen):
if first[i]!=last[i]:
return first[:i]
return first[:minlen]
判断单链表是否存在环。
Description
解题思路:
一个单链表如果不存在环,则最后一个元素的下一个节点必然为null.
如果单链表存在环,则:
设置两个指针,一个慢指针和一个快指针。将链表的环想象成是一个圆形操场,两个人在同一起跑线开始绕着操场无限循环跑,那么快的人必然会再一次和慢的人相遇,即快指针的元素和慢指针的元素相同时,即说明存在环。
在代码中,慢指针设置为每次走一步,即slow=slow.next,快指针设置为每次走两步,即fast=fast.next.next。实际步数设置是可以任取的,只是循环次数不同,如可以设置fast=fast.next.next.next。
1 | # Definition for singly-linked list. |
改进:
由于每次循环都要判断是否到达最后一个节点,因此leetcode上提供了另一种思路,即采取异常的方式。
“Easier to ask for forgiveness than permission.”
1
2
3
4
5
6
7
8
9
10 def hasCycle(self, head):
try:
slow = head
fast = head.next
while slow is not fast:
slow = slow.next
fast = fast.next.next
return True
except:
return False
寻找两个无环链表的交点。
Description
解题思路:
1 | # Definition for singly-linked list. |
查找两个数组的共有元素。
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].
Description
解题思路:
本来是想做关于排序的题目的,然后这道题的标签中就是含sort的,但我觉得用集合的方式会更简明些。
1 | class Solution(object): |
tip:
set求交集函数返回的是set,因此需要通过list进行转换。
从字符串中找出给定子字符串的索引,若不存在则返回-1。
Description
解题思路:
用python解决这道题很简单,因为python字符串自带的find的方法可以直接实现。1
2
3
4
5
6
7def strStr(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
return haystack.find(needle)
不采用find()方法的解题思路:
采用brute force方式,即依次从字符串的每个位置开始,截取和子字符串相同长度的字符串,与给定的子字符串进行比较。1
2
3
4
5
6
7
8
9
10def strStr(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
改进:http://blog.csdn.net/linhuanmars/article/details/20276833
提出了一种rolling hash的方式。
打家劫舍。问题本质就是从数组中找出一个或多个不相邻的数,使其和最大。
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
解题思路:
令dp[i]表示从[0, …, i]数组中能够得到的最大收益,显然,dp[0]=nums[0], dp[1]=max(dp[0],dp[1]), 现在计算dp[i+1]:
dp[i+1]=max(dp[i], dp[i-1]+nums[i+1])
其中,上式包含了如下隐含信息:
若dp[i]不包含nums[i], 所以nums[i+1]可以和dp[i]相加,但此时dp[i]=dp[i-1],所以dp[i-1]+nums[i+1]与dp[i]+nums[i+1]的值相等;
若dp[i]包含nums[i],则nums[i+1]不可以和dp[i]相加,所以只存在nums[i+1]+dp[i-1]。
实际计算时只需要保存两个变量即可。
1 | class Solution(object): |
tip:
python中的三目运算符不像其他语言, 其他的一般都是:
判定条件?为真时的结果:为假时的结果
而在python中的格式为:
为真时的结果 if 判定条件 else 为假时的结果