24 tháng 07 năm 2019 - Lĩnh vực Công nghệ Thông tin
1. Mô tả bài Lô Đề Nohu76 toán
Chúng ta được cung cấp một danh sách các khoảng, nhiệm vụ là hợp nhất tất cả các khoảng trùng lặp lại với nhau.
Ví dụ 1: Đầu vào:
[[1,3],[2,6],[8,10],[15,18]]
Đầu ra:
[[1,6],[8,10],[15,18]] [nohu club tai game nổ [nohu club tai](/post/6810/) hũ đổi thưởng](/post/what-is-a-container/)
Giải thích:
Khoảng [1,3] và [2,6] có phần giao nhau nên chúng được hợp nhất thành [1,6].
Ví dụ 2: Đầu vào:
[[1,4],[4,5]]
Đầu ra:
[[1,5]]
Giải thích:
Khoảng [1,4] và [4,5] có phần giao nhau.
Nguồn gốc bài toán: LeetCode
2. Cách tiếp cận giải quyết
Xét hai điểm x[0,1]
và y[0,1]
, nếu giá trị biên phải nhỏ nhất lớn hơn hoặc bằng giá trị biên trái lớn nhất thì chúng được coi là trùng lặp. Điều này có nghĩa rằng nếu min(x[1], y[1]) >= max(x[0], y[0])
, thì hai khoảng đó sẽ bị gộp lại.
Quá trình so sánh tổng thể diễn ra như sau:
- Bước 1: So sánh khoảng đầu tiên với tất cả các khoảng còn lại (từ 2 đến n), hợp nhất các phần trùng lặp và cập nhật lại khoảng đầu tiên.
- Bước 2: So sánh khoảng thứ hai với tất cả các khoảng tiếp theo (từ 3 đến n), hợp nhất các phần trùng lặp và cập nhật lại khoảng thứ hai.
- …
- Bước i: So sánh khoảng thứ i với tất cả các khoảng từ i+1 đến n, hợp nhất các phần trùng lặp và cập nhật lại khoảng thứ i.
- …
Nếu trong bước i không tìm thấy bất kỳ khoảng nào để hợp nhất, quá trình chuyển sang bước i+1. Ngược lại, nếu có hợp nhất xảy ra, quá trình lặp lại bước i cho đến khi hoàn thành toàn bộ danh sách.
3. Mã nguồn thực hiện bằng Golang
func min(x, y int) int {
if x < y {
return x
}
return y
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
func merge(intervals [][]int) [][]int {
i, j := 0, 0
for i < len(intervals) {
merged := false
for j = i + 1; j < len(intervals); {
x, y := intervals[i], intervals[j]
if min(x[1], y[1]) >= max(x[0], y[0]) {
merged = true
// Cập nhật khoảng ở vị trí i
intervals[i][0], intervals[i][1] = min(x[0], y[0]), max(x[1], y[1])
// Xóa khoảng ở vị trí j
intervals[j] = intervals[len(intervals)-1]
intervals = intervals[:len(intervals)-1]
continue
}
j++
}
if merged {
continue
}
i++
}
return intervals
}
#Golang #ThuậtToán