今日未早起,淦!
LeetCode1151. 最少交换次数来组合所有的 1
#滑动窗口
题目描述
给出一个二进制数组
data
,你需要通过交换位置,将数组中 任何位置 上的 1 组合到一起,并返回所有可能中所需 最少的交换次数。
1 | 示例 1: |
解题思路
(1). 我们需要得到的输出的最终效果是数组中所有的 $1$ 都被聚集于一个子数组中,这个子数组的长度就是数组中所有 $1$ 的数量 totalOnes
;
(2). 那么我们只需要判断所有长度等于 totalOnes
的子数组中含有 $1$ 最多的个数是多少就可以了,因为 $0$ 的个数就是需要交换的最少次数;
(3). 怎么快速的统计所有该长度的子数组的含 $1$ 数量呢?这里就可以使用滑动窗口;
(4). 首先统计第一个窗口内 $1$ 的个数,之后只需要移动滑动窗口,再分别加上移入窗口和移出窗口的元素即可,避免了对每个窗口遍历统计。
时间复杂度
O(N)
解题代码
1 | func minSwaps(data []int) int { |
249. 移位字符串分组
#map #字符串
题目描述
给定一个字符串,对该字符串可以进行 “移位” 的操作,也就是将字符串中每个字母都变为其在字母表中后续的字母,比如:”abc” -> “bcd”。这样,我们可以持续进行 “移位” 操作,从而生成如下移位序列:
"abc" -> "bcd" -> ... -> "xyz"
给定一个包含仅小写字母字符串的列表,将该列表中所有满足 “移位” 操作规律的组合进行分组并返回。
1 | 示例: |
解题思路
(1). 对于初始字符串数组中给定的所有元素,我们都要找到其对应的所有变换后的字符串,然后再在初始字符串数组中查找是否有这些变换后的字符串;
(2). 对于查找操作,用 map
是时间代价最小的方式,所以我们要先遍历整个字符串数组,将所有字符串存入 map
中;
(4). 在对某一个序列中应该出现的所有字符串的形态都进行查找后,再次遍历到属于该序列的某一个字符串时,就不用重新查找整个序列。所以要再使用一个 map
来记录已经遍历过且在初始字符串数组中的元素,因为存在重复元素,所以 map
的 value
要使用 int
类型记录出现的次数,并且在生成序列的时候要生成对应次数的该字符串;
(5). 因为最终的序列要按照字典序排列,那么对于遍历到的某一个元素,要在其序列的头部插入字典序在其前面的字符串,在其后面插入字典序在其后面的字符串。
时间复杂度
O(26*N)
解题代码
1 | func groupStrings(strings []string) [][]string { |
54. 螺旋矩阵
#模拟题
题目描述
给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
1 | 示例 1: |
1 | 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] |
1 | 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] |
解题思路
(1). 本题主要注意两点:如何确保外层矩阵不重复遍历;如果保证遍历的方向;
(2). 对于外层矩阵,可以采用四个变量 left
、right
、top
、bottom
限制矩阵的收缩范围;
(3). 对于最终行/列的遍历方向问题,设置两个 bool
变量 down
和 turnRight
,在向下\右遍历过后,将这两个变量置为 false
,否则置为 true
,就能保证下次是和上次相反的遍历方向。
时间复杂度
O(M*N)
解题代码
1 | func spiralOrder(matrix [][]int) []int { |
- Post title:早起刷题(Day 12)
- Post author:洪笳淏
- Create time:2022-04-14 10:00:00
- Post link:https://jiahaohong1997.github.io/2022/04/14/早起刷题(Day 12)/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.