feat: fix solution seed-cn.ts

This commit is contained in:
fly6516 2025-04-16 11:37:34 +08:00
parent 31d0f13e08
commit ff7928132c

View File

@ -68,7 +68,7 @@ const userData: Prisma.UserCreateInput[] = [
** 1**
### 1
\`\`\`shell
nums = [2,7,11,15], target = 9
@ -83,14 +83,14 @@ const userData: Prisma.UserCreateInput[] = [
[1,2]
\`\`\`
### 3
### 3
\`\`\`shell
nums = [3,3], target = 6
[0,1]
\`\`\`
##
##
\`\`\`math
2 <= nums.length <= 10^4
@ -435,7 +435,7 @@ vector<int> Solution::twoSum(vector<int>& nums, int target) {
0 0 
### 1
### 1
![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/01/02/addtwonumber1.jpg)
\`\`\`shell
@ -444,14 +444,14 @@ vector<int> Solution::twoSum(vector<int>& nums, int target) {
342 + 465 = 807.
\`\`\`
** 2**
### 2
\`\`\`shell
l1 = [0], l2 = [0]
[0]
\`\`\`
### 3
### 3
\`\`\`shell
l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
@ -807,146 +807,96 @@ nums2.length == n
\`\`\`C++
\`\`\``,
solution: `## 方法一:二分查找
solution: `## 方法一:归并排序
### Intuition
###
\`A\` 并进行排序。假设合并后的数组长度为 \`n\`,那么中位数是:
- 使
- \`n\` 是奇数,则为 \`A[n / 2]\`
- 0
- \`n\` 是偶数,则为 \`A[n / 2]\`\`A[n / 2 + 1]\` 的平均值。
\`nums1\` 的第一个元素,要么是 \`nums2\` 的第一个元素。因此,我们可以将两个指针 \`p1\`\`p2\` 分别放在每个数组的开头,然后我们可以通过比较 \`nums1[p1]\`\`nums2[p2]\` 的值来获取最小的元素。
# $m$ $n$
$O(m+n)$ $O(m+n)$ $O(1)$ $O(m+n)$
###
$O(log(m+n))$ $log$
1. \`m + n\`
$m+n$ $(m+n)/2$ $m+n$ $(m+n)/2$ $(m+n)/2+1$ $k$ $k$ $(m+n)/2$ $(m+n)/2+1$
- \`m + n\` 是奇数,我们寻找第 \`(m + n) / 2\` 个元素。
$A$ $B$ $k$ $A[k/21]$ $B[k/21]$ $/$ $A[k/21]$ $B[k/21]$ $A[0..k/22]$ $B[0..k/22]$ $k/21$ $A[k/21]$ $B[k/21]$ $(k/21)+(k/21)k2$ $k$
- \`m + n\` 是偶数,我们寻找第 \`(m + n) / 2\` 和第 \`(m + n) / 2 + 1\` 个元素的平均值。
2. \`p1\`\`p2\` 分别放在数组 \`nums1\`\`nums2\` 的开头。
![](https://assets.leetcode-cn.com/solution-static/4/4_fig1.png
3. \`p1\`\`p2\` 都在数组范围内,比较 \`p1\`\`p2\` 处的值:
- $A[k/21]<B[k/21]$则比 $A[k/21]$ 小的数最多只有 $A$ 的前 $k/21$ 个数和 $B$ 的前 $k/21$ 个数即比 $A[k/21]$ 小的数最多只有 $k2$ 因此 $A[k/21]$ 不可能是第 $k$ 个数$A[0]$ $A[k/21]$ 也都不可能是第 $k$ 个数可以全部排除
- \`nums1[p1]\` 小于 \`nums2[p2]\`,则将 \`p1\` 向右移动一位。
- $A[k/21]>B[k/21]$ $B[0]$ $B[k/21]$
- \`p2\` 向右移动一位。
- $A[k/21]=B[k/21]$
\`p1\` 超出了 \`nums1\` 的范围,就将 \`p2\` 向右移动一位。
$A[k/21] $B[k/21]$ $k/2$ $k$ $k$ $k$
\`p2\` 超出了 \`nums2\` 的范围,就将 \`p1\` 向右移动一位。
4.
- $A[k/21]$ $B[k/21]$ $k$ $k$ $k/2$
- \`m + n\` 是奇数,重复第 3 步 \`(m + n + 1) / 2\` 次并返回最后一个元素。
- $k$
- \`m + n\` 是偶数,重复第 3 步 \`(m + n) / 2 + 1\` 次并返回最后两个元素的平均值。
- $k=1$
\`\`\`math
A: 1 3 4 9
B: 1 2 3 4 5 6 7 8 9
\`\`\`
4 9 13 7 k=7
k/21=2 A[2] B[2]
\`\`\`math
A: 1 3 4 9
B: 1 2 3 4 5 6 7 8 9
\`\`\`
A[2]>B[2] B[0] B[2] B offset 3 k k=kk/2=4
k/21=1 A[1] B[4]
\`\`\`math
A: 1 3 4 9
B: [1 2 3] 4 5 6 7 8 9
\`\`\`
A[1]<B[4]因此排除 A[0] A[1]即数组 A 的下标偏移变为 2同时更新 k 的值k=kk/2=2
k/21=0 A[2] B[3]
\`\`\`math
A: [1 3] 4 9
B: [1 2 3] 4 5 6 7 8 9
\`\`\`
A[2]=B[3] A A[2] A 3 k k=kk/2=1
k 1 k A[3]>B[3] k B[3]=4
\`\`\`math
A: [1 3 4] 9
B: [1 2 3] 4 5 6 7 8 9
\`\`\`
###
###
\`\`\`c showLineNumbers
int solve(int* A, int aStart, int aEnd, int* B, int bStart, int bEnd, int k) {
// If the segment of on array is empty, it means we have passed all
// its element, just return the corresponding element in the other array.
if (aEnd < aStart) {
return B[k - aStart];
}
if (bEnd < bStart) {
return A[k - bStart];
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int m = nums1Size, n = nums2Size;
int p1 = 0, p2 = 0;
// Get the middle indexes and middle values of A and B.
int aIndex = (aStart + aEnd) / 2, bIndex = (bStart + bEnd) / 2;
int aValue = A[aIndex], bValue = B[bIndex];
// If k is in the right half of A + B, remove the smaller left half.
if (aIndex + bIndex < k) {
if (aValue > bValue) {
return solve(A, aStart, aEnd, B, bIndex + 1, bEnd, k);
} else {
return solve(A, aIndex + 1, aEnd, B, bStart, bEnd, k);
int getMin() {
if (p1 < m && p2 < n) {
return nums1[p1] < nums2[p2] ? nums1[p1++] : nums2[p2++];
} else if (p1 < m) {
return nums1[p1++];
} else if (p2 < n) {
return nums2[p2++];
}
return -1;
}
// Otherwise, remove the larger right half.
else {
if (aValue > bValue) {
return solve(A, aStart, aIndex - 1, B, bStart, bEnd, k);
} else {
return solve(A, aStart, aEnd, B, bStart, bIndex - 1, k);
}
}
}
double findMedianSortedArrays(int* A, int na, int* B, int nb) {
int n = na + nb;
if (n % 2 == 1) {
return solve(A, 0, na - 1, B, 0, nb - 1, n / 2);
double median;
if ((m + n) % 2 == 0) {
for (int i = 0; i < ((m + n) / 2) - 1; ++i) {
int temp = getMin();
}
median = (getMin() + getMin()) / 2.0;
} else {
return (solve(A, 0, na - 1, B, 0, nb - 1, n / 2) +
solve(A, 0, na - 1, B, 0, nb - 1, n / 2 - 1)) /
2.0;
for (int i = 0; i < (m + n) / 2; ++i) {
int temp = getMin();
}
median = getMin();
}
return median;
}
\`\`\`
###
Let $m$ be the size of array \`nums1\` and $n$ be the size of array \`nums2\`.
$m$ \`nums1\` 的大小,$n$ 为数组 \`nums2\` 的大小。
- **:** $O(log(m+n))$
- **** $O(m + n)$
- m n nums 1 nums 2 $k=(m+n)/2$ $k=(m+n)/2+1$ $O(log(m+n))$
- \`p1\`\`p2\` 处的两个值来获取最小元素,比较两个元素并移动相应指针耗时 $O(1)$
- **:** $O(1)$
-
- $O(m + n)$
- **** $O(1)$
- \`p1\`\`p2\`
`,
difficulty: "HARD",