Skip to content

Commit fdea593

Browse files
JavaScalaDeveloperJavaScalaDeveloper
authored andcommitted
删除$
1 parent 49ac40c commit fdea593

File tree

1,508 files changed

+5974
-5974
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,508 files changed

+5974
-5974
lines changed

solution/0000-0099/0001.Two Sum/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
## 解法
3737

3838
**方法一:哈希表**
39-
我们可以用哈希表 $m$ 存放数组值以及对应的下标
40-
遍历数组 `nums`,当发现 `target - nums[i]` 在哈希表中,说明找到了目标值,返回 `target - nums[i]` 的下标以及 $i$ 即可
41-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 `nums` 的长度。
39+
我们可以用哈希表m存放数组值以及对应的下标
40+
遍历数组 `nums`,当发现 `target - nums[i]` 在哈希表中,说明找到了目标值,返回 `target - nums[i]` 的下标以及i即可
41+
时间复杂度O(n),空间复杂度O(n)。其中n是数组 `nums` 的长度。
4242

4343
### **Java**
4444

solution/0000-0099/0002.Add Two Numbers/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@
4646

4747
**方法一:模拟**
4848

49-
我们同时遍历两个链表 $l_1$ 和 $l_2$,并使用变量 $carry$ 表示当前是否有进位
49+
我们同时遍历两个链表l_1和l_2,并使用变量carry表示当前是否有进位
5050

51-
每次遍历时,我们取出对应链表的当前位,计算它们与进位 $carry$ 的和,然后更新进位的值,最后将当前位的值加入答案链表。如果两个链表都遍历完了,并且进位为 $0$ 时,遍历结束。
51+
每次遍历时,我们取出对应链表的当前位,计算它们与进位carry的和,然后更新进位的值,最后将当前位的值加入答案链表。如果两个链表都遍历完了,并且进位为0时,遍历结束。
5252

5353
最后我们返回答案链表的头节点即可。
5454

55-
时间复杂度 $O(max(m, n))$,其中 $m$ 和 $n$ 分别为两个链表的长度。我们需要遍历两个链表的全部位置,而处理每个位置只需要 $O(1)$ 的时间。忽略答案的空间消耗,空间复杂度 $O(1)$
55+
时间复杂度O(max(m, n)),其中m和n分别为两个链表的长度。我们需要遍历两个链表的全部位置,而处理每个位置只需要O(1)的时间。忽略答案的空间消耗,空间复杂度O(1)。
5656

5757
### **Java**
5858

solution/0000-0099/0003.Longest Substring Without Repeating Characters/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@
4040

4141
**方法一:双指针 + 哈希表**
4242

43-
定义一个哈希表记录当前窗口内出现的字符,记 $i$ 和 $j$ 分别表示不重复子串的开始位置和结束位置,无重复字符子串的最大长度记为 `ans`
43+
定义一个哈希表记录当前窗口内出现的字符,记i和j分别表示不重复子串的开始位置和结束位置,无重复字符子串的最大长度记为 `ans`
4444

45-
遍历字符串 `s` 的每个字符 $s[j]$,我们记为 $c$。若 $s[i..j-1]$ 窗口内存在 $c$,则 $i$ 循环向右移动,更新哈希表,直至 $s[i..j-1]$ 窗口不存在 `c`,循环结束。将 `c` 加入哈希表中,此时 $s[i..j]$ 窗口内不含重复元素,更新 `ans` 的最大值。
45+
遍历字符串 `s` 的每个字符s[j],我们记为c。若s[i..j-1]窗口内存在c,则i循环向右移动,更新哈希表,直至s[i..j-1]窗口不存在 `c`,循环结束。将 `c` 加入哈希表中,此时s[i..j]窗口内不含重复元素,更新 `ans` 的最大值。
4646

4747
最后返回 `ans` 即可。
4848

49-
时间复杂度 $O(n)$,其中 $n$ 表示字符串 `s` 的长度。
49+
时间复杂度O(n),其中n表示字符串 `s` 的长度。
5050

5151
双指针算法模板:
5252

solution/0000-0099/0004.Median of Two Sorted Arrays/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,19 @@
3737

3838
**方法一:分治**
3939

40-
本题限制了时间复杂度为 $O(\log (m+n))$,看到这个时间复杂度,自然而然的想到了应该使用二分查找法来求解。那么回顾一下中位数的定义,如果某个有序数组长度是奇数,那么其中位数就是最中间那个,如果是偶数,那么就是最中间两个数字的平均值。这里对于两个有序数组也是一样的,假设两个有序数组的长度分别为 $m$ 和 $n$,由于两个数组长度之和 $m+n$ 的奇偶不确定,因此需要分情况来讨论,对于奇数的情况,直接找到最中间的数即可,偶数的话需要求最中间两个数的平均值。为了简化代码,不分情况讨论,我们使用一个小 trick,我们分别找第 $\frac{m+n+1}{2}$ 和 $\frac{m+n+2}{2}$ 个,然后求其平均值即可,这对奇偶数均适用。假如 $m+n$ 为奇数的话,那么其实 $\frac{m+n+1}{2}$ 和 $\frac{m+n+2}{2}$ 的值相等,相当于两个相同的数字相加再除以 2,还是其本身。
40+
本题限制了时间复杂度为O(\log (m+n)),看到这个时间复杂度,自然而然的想到了应该使用二分查找法来求解。那么回顾一下中位数的定义,如果某个有序数组长度是奇数,那么其中位数就是最中间那个,如果是偶数,那么就是最中间两个数字的平均值。这里对于两个有序数组也是一样的,假设两个有序数组的长度分别为m和n,由于两个数组长度之和m+n的奇偶不确定,因此需要分情况来讨论,对于奇数的情况,直接找到最中间的数即可,偶数的话需要求最中间两个数的平均值。为了简化代码,不分情况讨论,我们使用一个小 trick,我们分别找第\frac{m+n+1}{2}\frac{m+n+2}{2}个,然后求其平均值即可,这对奇偶数均适用。假如m+n为奇数的话,那么其实\frac{m+n+1}{2}\frac{m+n+2}{2}的值相等,相当于两个相同的数字相加再除以 2,还是其本身。
4141

42-
这里我们需要定义一个函数来在两个有序数组中找到第 $k$ 个元素,下面重点来看如何实现找到第 $k$ 个元素
42+
这里我们需要定义一个函数来在两个有序数组中找到第k个元素,下面重点来看如何实现找到第k个元素
4343

44-
首先,为了避免产生新的数组从而增加时间复杂度,我们使用两个变量 $i$ 和 $j$ 分别来标记数组 `nums1``nums2` 的起始位置。然后来处理一些边界问题,比如当某一个数组的起始位置大于等于其数组长度时,说明其所有数字均已经被淘汰了,相当于一个空数组了,那么实际上就变成了在另一个数组中找数字,直接就可以找出来了。还有就是如果 $k=1$ 的话,那么我们只要比较 `nums1``nums2` 的起始位置 $i$ 和 $j$ 上的数字就可以了
44+
首先,为了避免产生新的数组从而增加时间复杂度,我们使用两个变量i和j分别来标记数组 `nums1``nums2` 的起始位置。然后来处理一些边界问题,比如当某一个数组的起始位置大于等于其数组长度时,说明其所有数字均已经被淘汰了,相当于一个空数组了,那么实际上就变成了在另一个数组中找数字,直接就可以找出来了。还有就是如果k=1的话,那么我们只要比较 `nums1``nums2` 的起始位置i和j上的数字就可以了
4545

46-
难点就在于一般的情况怎么处理?因为我们需要在两个有序数组中找到第 $k$ 个元素,为了加快搜索的速度,我们要使用二分法,对 $k$ 二分,意思是我们需要分别在 `nums1` 和 `nums2` 中查找第 $\left \lfloor \frac{k}{2} \right \rfloor$ 个元素,注意这里由于两个数组的长度不定,所以有可能某个数组没有第 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字,所以我们需要先检查一下,数组中到底存不存在第 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字,如果存在就取出来,否则就赋值上一个整型最大值。如果某个数组没有第 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字,那么我们就淘汰另一个数字的前 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字即可。有没有可能两个数组都不存在第 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字呢,这道题里是不可能的,因为我们的 $k$ 不是任意给的,而是给的 $m+n$ 的中间值,所以必定至少会有一个数组是存在第 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字的
46+
难点就在于一般的情况怎么处理?因为我们需要在两个有序数组中找到第k个元素,为了加快搜索的速度,我们要使用二分法,对k二分,意思是我们需要分别在 `nums1` 和 `nums2` 中查找第\left \lfloor \frac{k}{2} \right \rfloor个元素,注意这里由于两个数组的长度不定,所以有可能某个数组没有第\left \lfloor \frac{k}{2} \right \rfloor个数字,所以我们需要先检查一下,数组中到底存不存在第\left \lfloor \frac{k}{2} \right \rfloor个数字,如果存在就取出来,否则就赋值上一个整型最大值。如果某个数组没有第\left \lfloor \frac{k}{2} \right \rfloor个数字,那么我们就淘汰另一个数字的前\left \lfloor \frac{k}{2} \right \rfloor个数字即可。有没有可能两个数组都不存在第\left \lfloor \frac{k}{2} \right \rfloor个数字呢,这道题里是不可能的,因为我们的k不是任意给的,而是给的m+n的中间值,所以必定至少会有一个数组是存在第\left \lfloor \frac{k}{2} \right \rfloor个数字的
4747

48-
最后是二分法的核心,比较这两个数组的第 $\left \lfloor \frac{k}{2} \right \rfloor$ 小的数字 `midVal1``midVal2` 的大小,如果第一个数组的第 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字小的话,那么说明我们要找的数字肯定不在 `nums1` 中的前 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字,所以我们可以将其淘汰,将 `nums1` 的起始位置向后移动 $\left \lfloor \frac{k}{2} \right \rfloor$ 个,并且此时的 $k$ 也自减去 $\left \lfloor \frac{k}{2} \right \rfloor$,调用递归。反之,我们淘汰 `nums2` 中的前 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字,并将 `nums2` 的起始位置向后移动 $\left \lfloor \frac{k}{2} \right \rfloor$ 个,并且此时的 $k$ 也自减去 $\left \lfloor \frac{k}{2} \right \rfloor$,调用递归即可。
48+
最后是二分法的核心,比较这两个数组的第\left \lfloor \frac{k}{2} \right \rfloor小的数字 `midVal1``midVal2` 的大小,如果第一个数组的第\left \lfloor \frac{k}{2} \right \rfloor个数字小的话,那么说明我们要找的数字肯定不在 `nums1` 中的前\left \lfloor \frac{k}{2} \right \rfloor个数字,所以我们可以将其淘汰,将 `nums1` 的起始位置向后移动\left \lfloor \frac{k}{2} \right \rfloor个,并且此时的k也自减去\left \lfloor \frac{k}{2} \right \rfloor,调用递归。反之,我们淘汰 `nums2` 中的前\left \lfloor \frac{k}{2} \right \rfloor个数字,并将 `nums2` 的起始位置向后移动\left \lfloor \frac{k}{2} \right \rfloor个,并且此时的k也自减去\left \lfloor \frac{k}{2} \right \rfloor,调用递归即可。
4949

50-
> 实际是比较两个数组中的第 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字哪一个可能到达最后合并后排序数组中的第 $k$ 个元素的位置,其中小的那个数字注定不可能到达,所以可以直接将小的元素对应的数组的前 $\left \lfloor \frac{k}{2} \right \rfloor$ 个数字淘汰
50+
> 实际是比较两个数组中的第\left \lfloor \frac{k}{2} \right \rfloor个数字哪一个可能到达最后合并后排序数组中的第k个元素的位置,其中小的那个数字注定不可能到达,所以可以直接将小的元素对应的数组的前\left \lfloor \frac{k}{2} \right \rfloor个数字淘汰
5151
52-
时间复杂度 $O(\log (m+n))$,其中 $m$ 和 $n$ 是两个数组的长度
52+
时间复杂度O(\log (m+n)),其中m和n是两个数组的长度
5353

5454
### **Java**
5555

solution/0000-0099/0005.Longest Palindromic Substring/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,18 @@
3232

3333
**方法一:动态规划**
3434

35-
设 $dp[i][j]$ 表示字符串 $s[i..j]$ 是否为回文串。
35+
设dp[i][j]表示字符串s[i..j]是否为回文串。
3636

37-
- 当 $j - i \lt 2$,即字符串长度为 `2` 时,只要 $s[i] == s[j]$,那么 $dp[i][j]$ 就为 `true`
38-
- 当 $j - i \ge 2$,有 $dp[i][j] = dp[i + 1][j - 1] \cap s[i] == s[j]$
37+
- 当j - i \lt 2,即字符串长度为 `2` 时,只要s[i] == s[j],那么dp[i][j]就为 `true`
38+
- 当j - i \ge 2,有dp[i][j] = dp[i + 1][j - 1] \cap s[i] == s[j]
3939

40-
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是字符串 $s$ 的长度
40+
时间复杂度O(n^2),空间复杂度O(n^2)。其中n是字符串s的长度
4141

4242
**方法二:枚举回文中间点**
4343

4444
我们可以枚举回文中间点,向两边扩散,找到最长的回文串。
4545

46-
时间复杂度 $O(n^2)$,空间复杂度 $O(1)$。其中 $n$ 是字符串 $s$ 的长度
46+
时间复杂度O(n^2),空间复杂度O(1)。其中n是字符串s的长度
4747

4848
### **Java**
4949

solution/0000-0099/0006.Zigzag Conversion/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ P I
6060

6161
**方法一:模拟**
6262

63-
我们用一个二维数组 $g$ 来模拟 $Z$ 字形排列的过程,其中 $g[i][j]$ 表示第 $i$ 行第 $j$ 列的字符。初始时 $i=0$,另外我们定义一个方向变量 $k$,初始时 $k=-1$,表示向上走。
63+
我们用一个二维数组g来模拟Z字形排列的过程,其中g[i][j]表示第i行第j列的字符。初始时i=0,另外我们定义一个方向变量k,初始时k=-1,表示向上走。
6464

65-
我们从左到右遍历字符串 $s$,每次遍历到一个字符 $c$,将其追加到 $g[i]$ 中,如果此时 $i=0$ 或者 $i=numRows-1$,说明当前字符位于 $Z$ 字形排列的拐点,我们将 $k$ 的值反转,即 $k=-k$。接下来,我们将 $i$ 的值更新为 $i+k$,即向上或向下移动一行。继续遍历下一个字符,直到遍历完字符串 $s$,我们返回 $g$ 中所有行拼接后的字符串即可
65+
我们从左到右遍历字符串s,每次遍历到一个字符c,将其追加到g[i]中,如果此时i=0或者i=numRows-1,说明当前字符位于Z字形排列的拐点,我们将k的值反转,即k=-k。接下来,我们将i的值更新为i+k,即向上或向下移动一行。继续遍历下一个字符,直到遍历完字符串s,我们返回g中所有行拼接后的字符串即可
6666

67-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 $s$ 的长度
67+
时间复杂度O(n),空间复杂度O(n)。其中n为字符串s的长度
6868

6969
### **Java**
7070

solution/0000-0099/0007.Reverse Integer/README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,25 @@
4949

5050
**方法一:数学**
5151

52-
我们不妨记 $mi$ 和 $mx$ 分别为 $-2^{31}$ 和 $2^{31} - 1$,则 $x$ 的反转结果 $ans$ 需要满足 $mi \le ans \le mx$
52+
我们不妨记mi和mx分别为-2^{31}和2^{31} - 1,则x的反转结果ans需要满足mi \le ans \le mx。
5353

54-
我们可以通过不断地对 $x$ 取余来获取 $x$ 的最后一位数字 $y$,并将 $y$ 添加到 $ans$ 的末尾。在添加 $y$ 之前,我们需要判断 $ans$ 是否溢出。即判断 $ans \times 10 + y$ 是否在 $[mi, mx]$ 的范围内。
54+
我们可以通过不断地对x取余来获取x的最后一位数字y,并将y添加到ans的末尾。在添加y之前,我们需要判断ans是否溢出。即判断ans \times 10 + y是否在[mi, mx]的范围内。
5555

56-
若 $x \gt 0$,那么需要满足 $ans \times 10 + y \leq mx$,即 $ans \times 10 + y \leq \left \lfloor \frac{mx}{10} \right \rfloor \times 10 + 7$。整理得 $(ans - \left \lfloor \frac{mx}{10} \right \rfloor) \times 10 \leq 7 - y$
56+
若x \gt 0,那么需要满足ans \times 10 + y \leq mx,即ans \times 10 + y \leq \left \lfloor \frac{mx}{10} \right \rfloor \times 10 + 7。整理得(ans - \left \lfloor \frac{mx}{10} \right \rfloor) \times 10 \leq 7 - y。
5757

5858
下面我们讨论上述不等式成立的条件:
5959

60-
- 当 $ans \lt \left \lfloor \frac{mx}{10} \right \rfloor$ 时,不等式显然成立;
61-
- 当 $ans = \left \lfloor \frac{mx}{10} \right \rfloor$ 时,不等式成立的充要条件是 $y \leq 7$。如果 $ans = \left \lfloor \frac{mx}{10} \right \rfloor$ 并且还能继续添加数字,说明此时数字是最高位,即此时 $y$ 一定不超过 $2$,因此,不等式一定成立;
62-
- 当 $ans \gt \left \lfloor \frac{mx}{10} \right \rfloor$ 时,不等式显然不成立。
60+
- 当ans \lt \left \lfloor \frac{mx}{10} \right \rfloor时,不等式显然成立;
61+
- 当ans = \left \lfloor \frac{mx}{10} \right \rfloor时,不等式成立的充要条件是y \leq 7。如果ans = \left \lfloor \frac{mx}{10} \right \rfloor并且还能继续添加数字,说明此时数字是最高位,即此时y一定不超过2,因此,不等式一定成立;
62+
- 当ans \gt \left \lfloor \frac{mx}{10} \right \rfloor时,不等式显然不成立。
6363

64-
综上,当 $x \gt 0$ 时,不等式成立的充要条件是 $ans \leq \left \lfloor \frac{mx}{10} \right \rfloor$
64+
综上,当x \gt 0时,不等式成立的充要条件是ans \leq \left \lfloor \frac{mx}{10} \right \rfloor。
6565

66-
同理,当 $x \lt 0$ 时,不等式成立的充要条件是 $ans \geq \left \lfloor \frac{mi}{10} \right \rfloor$
66+
同理,当x \lt 0时,不等式成立的充要条件是ans \geq \left \lfloor \frac{mi}{10} \right \rfloor。
6767

68-
因此,我们可以通过判断 $ans$ 是否在 $[\left \lfloor \frac{mi}{10} \right \rfloor, \left \lfloor \frac{mx}{10} \right \rfloor]$ 的范围内来判断 $ans$ 是否溢出。若溢出,则返回 $0$。否则,将 $y$ 添加到 $ans$ 的末尾,然后将 $x$ 的最后一位数字去除,即 $x \gets \left \lfloor \frac{x}{10} \right \rfloor$
68+
因此,我们可以通过判断ans是否在[\left \lfloor \frac{mi}{10} \right \rfloor, \left \lfloor \frac{mx}{10} \right \rfloor]的范围内来判断ans是否溢出。若溢出,则返回0。否则,将y添加到ans的末尾,然后将x的最后一位数字去除,即x \gets \left \lfloor \frac{x}{10} \right \rfloor。
6969

70-
时间复杂度 $O(\log |x|)$,其中 $|x|$ 为 $x$ 的绝对值。空间复杂度 $O(1)$
70+
时间复杂度O(\log |x|),其中|x|为x的绝对值。空间复杂度O(1)。
7171

7272
### **Java**
7373

0 commit comments

Comments
 (0)