从一月二十开始成为了Leetcode刷题大军中的一员,然而自己水平实在太渣一个多月只刷了五十五道还有很多是看得答案——甚至有一些答案都看不懂(宝宝心里苦)
目前按照网上的教程刷完了数组,查找表,链表三个章节一些比较有代表性的题目,所以特地开一篇文章记录下自己刷题的历程以及每道题的核心思路。
数组类:
(1)首先是leetcode 75题颜色分类
题目描述如下:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
方法一:基于计数排序的方法
核心思路:遍历一次分别记录0,1,2的个数,之后重新构建一个新的数组
class Solution(object):
def sortColors(self, nums):
o = 0
p = 0
q = 0
for i in range(len(nums)):
if nums[i] == 0:
o = o+1
if nums[i] == 1:
p = p+1
if nums[i] == 2:
q = q+1
for j in range(0,o):
nums[j] = 0
for j in range(o,o+p):
nums[j] = 1
for j in range(o+p,len(nums)):
nums[j] = 2
方法二:基于三路快排的思想(我没想出来)
核心思路:
使用一次扫描的办法。
设立三根指针,left, index, right。定义如下规则:left 的左侧都是 0(不含 left)
right 的右侧都是 2(不含 right)
index 从左到右扫描每个数,如果碰到 0 就丢给 left,碰到 2 就丢给 right。碰到 1 就跳过不管
class Solution:
"""
@param nums: A list of integer which is 0, 1 or 2
@return: nothing
"""
def sortColors(self, A):
left, index, right = 0, 0, len(A) - 1
# be careful, index < right is not correct
while index <= right:
if A[index] == 0:
A[left], A[index] = A[index], A[left]
left += 1
index += 1
elif A[index] == 1:
index += 1
else:
A[right], A[index] = A[index], A[right]
right -= 1