LCS
LCS01.下载插件(3)
小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。假定每分钟选择以下两种策略之一:
使用当前带宽下载插件
将带宽加倍(下载插件数量随之加倍)
请返回小扣完成下载 n 个插件最少需要多少分钟。
注意:实际的下载的插件数量可以超过 n 个
示例 1:输入:n = 2 输出:2
解释:以下两个方案,都能实现 2 分钟内下载 2 个插件
方案一:第一分钟带宽加倍,带宽可每分钟下载 2 个插件;第二分钟下载 2 个插件
方案二:第一分钟下载 1 个插件,第二分钟下载 1 个插件
示例 2:输入:n = 4 输出:3
解释:最少需要 3 分钟可完成 4 个插件的下载,以下是其中一种方案:
第一分钟带宽加倍,带宽可每分钟下载 2 个插件;
第二分钟下载 2 个插件;
第三分钟下载 2 个插件。
提示:1 <= n <= 10^5
No. |
思路 |
时间复杂度 |
空间复杂度 |
01 |
遍历 |
O(log(n)) |
O(1) |
02 |
内置函数 |
O(log(n)) |
O(1) |
03 |
内置函数 |
O(log(n)) |
O(1) |
func leastMinutes(n int) int {
res := 0
for i := 1; i < n; i = i * 2 {
res++
}
return res + 1
}
# 2
func leastMinutes(n int) int {
return bits.Len(uint(n)-1)+1
}
# 3
func leastMinutes(n int) int {
res := int(math.Ceil(math.Log(float64(n)) / math.Log(2)))
return res + 1
}
LCS02.完成一半题目(1)
有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。
主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。
若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。
示例 1:输入:questions = [2,1,6,2] 输出:1
解释:有 2 位扣友在 4 道题目中选择 2 题。
可选择完成知识点类型为 2 的题目时,此时仅一种知识点类型
因此至少包含 1 种知识点类型。
示例 2:输入:questions = [1,5,1,3,4,5,2,5,3,3,8,6] 输出:2
解释:有 6 位扣友在 12 道题目中选择题目,需要选择 6 题。
选择完成知识点类型为 3、5 的题目,因此至少包含 2 种知识点类型。
提示:questions.length == 2*n
2 <= questions.length <= 10^5
1 <= questions[i] <= 1000
No. |
思路 |
时间复杂度 |
空间复杂度 |
01 |
遍历 |
O(nlog(n)) |
O(n) |
func halfQuestions(questions []int) int {
res := 0
n := len(questions)
arr := make([]int, 1001)
for i := 0; i < n; i++ {
arr[questions[i]]++
}
sort.Ints(arr)
count := n / 2
for i := 1000; i >= 0; i-- {
res++
count = count - arr[i]
if count <= 0 {
break
}
}
return res
}
LCS03.主题空间(1)
「以扣会友」线下活动所在场地由若干主题空间与走廊组成,场地的地图记作由一维字符串型数组 grid,
字符串中仅包含 "0"~"5" 这 6 个字符。
地图上每一个字符代表面积为 1 的区域,其中 "0" 表示走廊,其他字符表示主题空间。
相同且连续(连续指上、下、左、右四个方向连接)的字符组成同一个主题空间。
假如整个 grid 区域的外侧均为走廊。请问,不与走廊直接相邻的主题空间的最大面积是多少?如果不存在这样的空间请返回 0。
示例 1:输入:grid = ["110","231","221"] 输出:1
解释:4 个主题空间中,只有 1 个不与走廊相邻,面积为 1。
示例 2:输入:grid = ["11111100000","21243101111","21224101221","11111101111"] 输出:3
解释:8 个主题空间中,有 5 个不与走廊相邻,面积分别为 3、1、1、1、2,最大面积为 3。
提示:1 <= grid.length <= 500
1 <= grid[i].length <= 500
grid[i][j] 仅可能是 "0"~"5"
No. |
思路 |
时间复杂度 |
空间复杂度 |
01 |
深度优先搜索 |
O(n^2) |
O(n) |
var count int
var flag bool
func largestArea(grid []string) int {
res := 0
for i := 0; i < len(grid); i++ {
for j := 0; j < len(grid[i]); j++ {
if '1' <= grid[i][j] && grid[i][j] <= '5' {
count, flag = 0, true
dfs(grid, i, j, grid[i][j])
if flag == true && count > res {
res = count
}
}
}
}
return res
}
func dfs(grid []string, i, j int, char byte) {
if i < 0 || i >= len(grid) || j < 0 || j >= len(grid[0]) || grid[i][j] == '0' {
flag = false
return
}
if grid[i][j] != char {
return
}
count++
arr := []byte(grid[i])
arr[j] = arr[j] + 5
grid[i] = string(arr)
dfs(grid, i+1, j, char)
dfs(grid, i-1, j, char)
dfs(grid, i, j+1, char)
dfs(grid, i, j-1, char)
return
}