Skip to content

Commit 165cc33

Browse files
committed
更新md
更新md
1 parent 87ad8b3 commit 165cc33

12 files changed

+424
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组。
2+
例如,在字符串 S = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。
3+
我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。
4+
最终结果按照字典顺序输出。
5+
示例:
6+
```python
7+
输入: "abbxxxxzzy"
8+
输出: [[3,6]]
9+
解释: "xxxx" 是一个起始于 3 且终止于 6 的较大分组。
10+
11+
输入: "abcdddeeeeaabbbcd"
12+
输出: [[3,5],[6,9],[12,14]]
13+
```
14+
15+
#### 分析:
16+
* 遍历数组
17+
* current_s 记录当前计数的字母
18+
* current_s_count 记录当前计数字母的数量
19+
* 注意遍历结束后 current_s_count >=3的情况
20+
21+
代码:
22+
```python
23+
def largeGroupPositions(S):
24+
res = []
25+
current_s = None
26+
current_s_count = 0
27+
for index, s in enumerate(S):
28+
if not current_s:
29+
current_s = s
30+
current_s_count += 1
31+
else:
32+
if current_s == s:
33+
current_s_count += 1
34+
else:
35+
if current_s_count >= 3:
36+
res.append([index-current_s_count, index-1])
37+
current_s = s
38+
current_s_count = 1
39+
40+
# 遍历结束后的情况
41+
if current_s_count >= 3:
42+
res.append([len(S) - current_s_count, len(S) - 1])
43+
```
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。
2+
3+
现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。
4+
示例:
5+
```python
6+
输入:
7+
bits = [1, 0, 0]
8+
输出: True
9+
解释:
10+
唯一的编码方式是一个两比特字符和一个一比特字符。
11+
所以最后一个字符是一比特字符。
12+
13+
输入:
14+
bits = [1, 1, 1, 0]
15+
输出: False
16+
解释:
17+
唯一的编码方式是两比特字符和两比特字符。
18+
所以最后一个字符不是一比特字符。
19+
```
20+
21+
#### 分析:
22+
* 从左向右扫描数组
23+
* 如果元素是1,说明是两比特字符,向后跳两步
24+
* 如果元素是0,说明是一比特字符,向后跳一步
25+
* 如果最终落在了 bits.length−1 的位置,那么说明最后一位一定是一比特字符。
26+
27+
```python
28+
class Solution:
29+
def isOneBitCharacter(self, bits: List[int]) -> bool:
30+
i = 0
31+
while i < len(bits) - 1:
32+
if bits[i] == 1:
33+
# 跳两步
34+
i += 2
35+
elif bits[i] == 0:
36+
# 跳一步
37+
i += 1
38+
return i == len(bits) - 1
39+
```

leetcode_array/main.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,14 @@
2828
26. [最短无序连续子数组](最短无序连续子数组.md)
2929
27. [种花问题](种花问题.md)
3030
28. [三个数的最大乘积](三个数的最大乘积.md)
31+
29. [子数组最大平均数I](子数组最大平均数I.md)
32+
30. [图片平滑器](图片平滑器.md)
33+
31. [非递减数列](非递减数列.md)
34+
32. [最长连续递增序列](最长连续递增序列.md)
35+
33. [数组的度](数组的度.md)
36+
34. [1比特与2比特字符](1比特与2比特字符.md)
37+
35. [寻找数组的中心索引](寻找数组的中心索引.md)
38+
36. [至少是其他数字两倍的最大数](至少是其他数字两倍的最大数.md)
39+
37. [托普利茨矩阵](托普利茨矩阵.md)
40+
38. [ 较大分组的位置]( 较大分组的位置.md)
41+
39. [ 翻转图像]( 翻转图像.md)

leetcode_array/图片平滑器.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。
2+
其实就是求(i,j)周围8个点+(i,j)在内9个点的和的平均值
3+
示例:
4+
```python
5+
输入:
6+
[[1,1,1],
7+
[1,0,1],
8+
[1,1,1]]
9+
输出:
10+
[[0, 0, 0],
11+
[0, 0, 0],
12+
[0, 0, 0]]
13+
解释:
14+
对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
15+
对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
16+
对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0
17+
```
18+
代码
19+
```python
20+
def imageSmoother(M):
21+
rows = len(M)
22+
columns = len(M[0])
23+
res = [[0] * columns for _ in range(rows)]
24+
25+
for r in range(rows):
26+
for c in range(columns):
27+
# 计算(r,c)周边8个元素 + (r,c)在内 9个元素的和
28+
count = 0
29+
for nr in (r-1, r, r+1):
30+
for nc in (c-1, c, c+1):
31+
if 0<=nr<rows and 0<=nc<columns:
32+
res[r][c] += M[nr][nc]
33+
count += 1
34+
res[r][c] //= count
35+
return res
36+
```
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
2+
示例:
3+
```python
4+
输入: [1,12,-5,-6,50,3], k = 4
5+
输出: 12.75
6+
解释: 最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
7+
```
8+
#### 方法一:累计求和,时间复杂度O(n),空间复杂度O(n)
9+
* 遍历数组,计算原数组nums在索引i位置的累计和,存到新数组中
10+
* 遍历新数组,计算索引 i 和 i-k位置的最大差值。
11+
12+
```python
13+
def findMaxAverage(nums, k):
14+
sum_list = []
15+
sum_ = 0
16+
for index, item in enumerate(nums):
17+
sum_ += item
18+
sum_list.append(sum_)
19+
20+
max_ = float('-inf')
21+
for i in range(k-1, len(sum_list)):
22+
if i == k-1:
23+
value = sum_list[i]
24+
else:
25+
value = sum_list[i] - sum_list[i-k]
26+
max_ = max(max_, value)
27+
return max_/k
28+
```
29+
#### 方法二:滑动窗口
30+
```python
31+
[1,2,3,4,5,6,7]
32+
# 前4位和是 1+2+3+4 = 10
33+
# 滑动遍历
34+
2+3+4+5 = 10+5-1 = 14
35+
3+4+5+6 = 14+6-2 = 18
36+
# 每次滑动计算子数组的和 sum = sum + nums[i] - nums[i-k]
37+
```
38+
代码
39+
```python
40+
def findMaxAverage(nums, k):
41+
sum_ = sum(nums[:k])
42+
max_ = sum_
43+
for i in range(k, len(nums)):
44+
sum_ = sum_ + nums[i] - nums[i-k]
45+
max_ = max(sum_, max_)
46+
return max_/k
47+
```
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
给定一个整数类型的数组 nums,请编写一个能够返回数组 “中心索引” 的方法。
2+
3+
中心索引:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
4+
示例:
5+
```python
6+
输入:
7+
nums = [1, 7, 3, 6, 5, 6]
8+
输出:3
9+
解释:
10+
索引 3 (nums[3] = 6) 的左侧数之和 (1 + 7 + 3 = 11),
11+
与右侧数之和 (5 + 6 = 11) 相等。
12+
同时, 3 也是第一个符合要求的中心索引。
13+
```
14+
15+
#### 分析:
16+
* 特殊情况是数组两边的元素为中心索引
17+
* 当第一个元素是中心索引,则其余元素之和为0,数组的总和=第一个元素。
18+
* 当最后一个元素是中心索引,同理。
19+
* 当中间的元素是中心索引时,数组的和-中心索引元素 = 左边元素和 * 2
20+
21+
```python
22+
class Solution:
23+
def pivotIndex(self, nums: List[int]) -> int:
24+
if not nums:
25+
return -1
26+
sum_ = sum(nums)
27+
# 第一个元素为中心索引的情况
28+
if sum_ == nums[0]:
29+
return 0
30+
31+
# 其他情况
32+
left_sum = 0
33+
for i in range(len(nums)-1):
34+
left_sum += nums[i]
35+
if sum_-nums[i+1] == left_sum * 2:
36+
return i + 1
37+
38+
# 最后一个元素为中心索引的情况
39+
if sum_ == nums[-1]:
40+
return len(nums) -1
41+
42+
return -1
43+
```
44+
45+
#### 其实以上三种情况可以整合为一种情况
46+
```python
47+
class Solution:
48+
def pivotIndex(self, nums: List[int]) -> int:
49+
sum_ = sum(nums)
50+
left_sum = 0
51+
for i in range(len(nums)):
52+
if left_sum == sum_ - nums[i] - left_sum:
53+
return i
54+
left_sum += nums[i]
55+
return -1
56+
```
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。
2+
给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True。
3+
示例:
4+
```python
5+
输入:
6+
matrix = [
7+
[1,2,3,4],
8+
[5,1,2,3],
9+
[9,5,1,2]
10+
]
11+
输出: True
12+
解释:
13+
在上述矩阵中, 其对角线为:
14+
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"
15+
各条对角线上的所有元素均相同, 因此答案是True
16+
17+
输入:
18+
matrix = [
19+
[1,2],
20+
[2,2]
21+
]
22+
输出: False
23+
解释:
24+
对角线"[1, 2]"上的元素不同。
25+
```
26+
#### 分析:找规律
27+
```python
28+
1234
29+
5123
30+
9512
31+
发现每行[0:-1] 的元素 等于 下一行[1:]
32+
```
33+
代码
34+
```python
35+
def isToeplitzMatrix(matrix):
36+
if len(matrix) == 1:
37+
return True
38+
for i in range(1, len(matrix)):
39+
if matrix[i][1:] == matrix[i-1][:-1]:
40+
continue
41+
else:
42+
return False
43+
return True
44+
```

leetcode_array/数组的度.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
2+
3+
你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
4+
示例:
5+
```python
6+
输入: [1, 2, 2, 3, 1]
7+
输出: 2
8+
解释:
9+
输入数组的度是2,因为元素12的出现频数最大,均为2.
10+
连续子数组里面拥有相同度的有如下所示:
11+
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
12+
最短连续子数组[2, 2]的长度为2,所以返回2.
13+
14+
输入: [1,2,2,3,1,4,2]
15+
输出: 6
16+
17+
输入: [1,2,2,1,2,1,1,1,1,2,2,2]
18+
输出: 9
19+
```
20+
21+
#### 分析:
22+
* 具有度数 d 的数组必须有一些元素 x 出现 d 次。如果某些子数组具有相同的度数,那么某些元素 x (出现 d 次)。最短的子数组是将从 x 的第一次出现到最后一次出现的数组。
23+
* 遍历数组,记录元素第一次出现的位置和最后一次出现的位置,以及每个元素出现的次数。
24+
* 找到出现次数最多的元素,计算最短子数组的长度。
25+
26+
```python
27+
def findShortestSubArray(nums):
28+
left, right, count = {}, {}, {}
29+
# 遍历数组,记录元素第一次出现的位置和最后一次出现的位置,以及元素出现的次数
30+
for i, item in enumerate(nums):
31+
if item not in left:
32+
left[item] = i
33+
right[item] = i
34+
count[item] = count.get(item, 0) + 1
35+
36+
min_len = len(nums)
37+
# 找出出现次数最多的元素
38+
max_times = max(count.values())
39+
for item, times in count.items():
40+
if times == max_times:
41+
# 最小子数组的长度
42+
min_len = min(right[item] - left[item] + 1, min_len)
43+
return min_len
44+
```
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
给定一个未经排序的整数数组,找到最长且连续的的递增序列,并返回该序列的长度。
2+
示例:
3+
```python
4+
输入: [1,3,5,4,7]
5+
输出: 3
6+
解释: 最长连续递增序列是 [1,3,5], 长度为3
7+
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为57在原数组里被4隔开。
8+
```
9+
#### 方法一:累计计算
10+
```python
11+
def findLengthOfLCIS(nums):
12+
if not nums:
13+
return 0
14+
count = 1
15+
max_count = 1
16+
for i in range(len(nums)-1):
17+
if nums[i] < nums[i+1]:
18+
count += 1
19+
max_count = max(max_count, count)
20+
else:
21+
count = 1
22+
return max_count
23+
```

leetcode_array/翻转图像.md

Whitespace-only changes.

0 commit comments

Comments
 (0)