冒泡排序练习——合并区间、颜色分类
冒泡排序
冒泡排序正如其名,给出一组数字,从第一个数字开始,与它下一个数字进行比较,以升序排列为例,如果数组第一个位置数字比它下一个位置的数字数值大,则将这两个数字交换位置,然后将当前数组的第二个位置的数字与它下一个位置(即第三个位置)的数字进行比较。循环这个比较、交换的过程,直到当前关注的数字升到合适的位置为止(即下一个位置的数字数值比当前关注的数字数值大),接下来依然从数组第一个位置的数字开始,循环这个过程。如图所示
Leetcode合并区间
问题描述:
给出一个区间的集合,请合并所有重叠的区间。
示例:
输入:[[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
思考:
这道题分为两步,首先将输入数据中的各个区间进行排列,排列的目标是按照左边界进行升序排列。然后对排序好的数据的右边界进行比较。
排序的方法按照冒泡排序进行。比较的过程用到的比较条件是:
①
a
i
[
右
边
界
]
<
a
i
+
1
[
左
边
界
]
a_{i}\left[ 右边界 \right]<a_{i+1}\left[ 左边界 \right]
ai[右边界]<ai+1[左边界],表示
a
i
a_i
ai是一个独立的区间
②
a
i
[
右
边
界
]
=
a
i
+
1
[
左
边
界
]
a_{i}\left[ 右边界 \right]=a_{i+1}\left[ 左边界 \right]
ai[右边界]=ai+1[左边界],表示
a
i
a_i
ai和
a
i
+
1
a_{i+1}
ai+1可以合并成一个区间,这个区间的左边界是
a
i
a_i
ai的左边界,这个区间的右边界是
a
i
+
1
a_{i+1}
ai+1的右边界
③
a
i
+
1
[
左
边
界
]
<
a
i
[
右
边
界
]
<
a
i
+
1
[
右
边
界
]
a_{i+1}\left[ 左边界 \right]<a_{i}\left[ 右边界 \right]<a_{i+1}\left[ 右边界 \right]
ai+1[左边界]<ai[右边界]<ai+1[右边界],表示
a
i
a_i
ai和
a
i
+
1
a_{i+1}
ai+1可以合并成一个区间,这个区间的左边界是
a
i
a_i
ai的左边界,这个区间的右边界是
a
i
+
1
a_{i+1}
ai+1的右边界
④
a
i
[
右
边
界
]
=
a
i
+
1
[
右
边
界
]
a_{i}\left[ 右边界 \right]=a_{i+1}\left[ 右边界 \right]
ai[右边界]=ai+1[右边界],表示
a
i
a_i
ai和
a
i
+
1
a_{i+1}
ai+1可以合并成一个区间,这个区间的左边界是
a
i
a_i
ai的左边界,这个区间的右边界是
a
i
a_{i}
ai的右边界
⑤
a
i
[
右
边
界
]
>
a
i
+
1
[
右
边
界
]
a_{i}\left[ 右边界 \right]>a_{i+1}\left[ 右边界 \right]
ai[右边界]>ai+1[右边界],表示
a
i
a_i
ai和
a
i
+
1
a_{i+1}
ai+1可以合并成一个区间,这个区间的左边界是
a
i
a_i
ai的左边界,这个区间的右边界是
a
i
a_{i}
ai的右边界
具体代码如下
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if intervals == []:
return []
record_exchange = []
record_result = []
record_newlist = []
#冒泡排序过程
for index_1 in range(0, len(intervals)):
for index_2 in range(0, len(intervals) - index_1 - 1):
if intervals[index_2][0] > intervals[index_2 + 1][0]:
record_exchange = intervals[index_2]
intervals[index_2] = intervals[index_2 + 1]
intervals[index_2 + 1] = record_exchange
record_result.append(intervals[0])
#边界比较过程
for index in range(0, len(intervals)):
if record_result[-1][1] < intervals[index][0]:
record_result.append(intervals[index])
if record_result[-1][1] == intervals[index][0]:
record_result[-1][1] = intervals[index][1]
if record_result[-1][1] > intervals[index][0] and record_result[-1][1] < intervals[index][1]:
record_result[-1][1] = intervals[index][1]
if record_result[-1][1] > intervals[index][0] and record_result[-1][1] == intervals[index][1]:
continue
if record_result[-1][1] > intervals[index][1]:
continue
return record_result
Leetcode颜色分类
问题描述:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例:
输入:[2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
思考:
这道题就是一个简单的冒泡排序过程
具体代码如下
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
for index_1 in range(len(nums)):
for index_2 in range(0, len(nums) - index_1 - 1):
if nums[index_2] > nums[index_2 + 1]:
record = nums[index_2]
nums[index_2] = nums[index_2 + 1]
nums[index_2 + 1] = record
return nums