Files
algorithm-homework/AlgorithmHomework5.md
T
2020-03-28 22:05:55 +08:00

129 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Algorithm Homework 5
> 姓名:阙建明
>
> 学号:1901213139
## 作业要求:
Leetcode: 56,148,274
## 题解:
- ### Leetcode problem 56
> [合并区间](https://leetcode-cn.com/problems/merge-intervals/)
- **算法思路:**
- 首先对列表从小到大排序;
- 然后用两个指针,一个cur指向当前值,一个next指向下一个要对比的值;
- 如果下一个元素的左边界比当前元素的右边界要大,则无需合并,next右移;
- 如果下一个元素的左边界小于等于当前元素的右边界,则需要合并,进一步判断下一个元素的右边界是否大于当前元素的右边界,如果是,则修改当前元素的右边界为下一个元素的右边界。接着next右移
- **Leetcode提交结果:**
![image-20200328175231308](AlgorithmHomework5.assets/image-20200328175231308.png)
- **代码:**
```python
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort()
cur, nextElement = 0, 1
while nextElement < len(intervals):
if intervals[nextElement][0] <= intervals[cur][1]:
if intervals[nextElement][1] > intervals[cur][1]:
intervals[cur][1] = intervals[nextElement][1]
else:
intervals[cur + 1], cur = intervals[nextElement], cur + 1
nextElement = nextElement + 1
return intervals[0:cur + 1]
```
- ### Leetcode problem 148
> [排序链表](https://leetcode-cn.com/problems/sort-list/)
- **算法思路:**
- 用快慢指针来进行将一个链表分成两个独立的子链表;
- 采用分治和递归的思想对每个子链表进行递归排序之后归并子链表。
- **Leetcode提交结果:**
![image-20200328215223724](AlgorithmHomework5.assets/image-20200328215223724.png)
- **代码:**
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def sortList(self, head: ListNode) -> ListNode:
def twoWayMerge(l1: ListNode, l2: ListNode) -> ListNode:
if l1 is None:
return l2
if l2 is None:
return l1
head = ans = l1 if l1.val < l2.val else l2
if l1.val < l2.val:
l1 = l1.next
else:
l2 = l2.next
while l1 is not None and l2 is not None:
if l1.val < l2.val:
ans.next, l1 = l1, l1.next
else:
ans.next, l2 = l2, l2.next
ans = ans.next
if l1 is not None:
ans.next = l1
else:
ans.next = l2
return head
if head is None or head.next is None:
return head
fast, slow, pre = head, head, None
while fast is not None:
if fast.next is not None:
slow, fast, pre = slow.next, fast.next.next, slow
else:
break
if pre is not None:
pre.next = None
return twoWayMerge(self.sortList(head), self.sortList(slow))
```
- ### Leetcode problem 274
> [H指数](https://leetcode-cn.com/problems/h-index/)
- **算法思路:**
- 对数组从大到小排序;
- 则对于排序后的数组的下标为H-1个元素必然大于H,且如果存在,下标为H的元素必然小于H。
- **Leetcode提交结果:**
![image-20200328220025887](AlgorithmHomework5.assets/image-20200328220025887.png)
- **代码:**
```python
class Solution:
def hIndex(self, citations: List[int]) -> int:
citations.sort(reverse=True)
for i, v in enumerate(citations):
if v < i + 1:
return i
return len(citations)
```