题目描述:
给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。
序号代表了一个元素有多大。序号编号的规则如下:
序号从 1 开始编号。
一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
每个数字的序号都应该尽可能地小。
题解:
排序后用哈希表保存排序,再遍历数组根据哈希表更改数值
代码(Go):
func arrayRankTransform(arr []int) []int {
temp := append([]int{}, arr...)
sort.Ints(temp)
dict := map[int]int{}
num := 1
for _, v := range temp {
if _, ok := dict[v];!ok {
dict[v] = num
num++
}
}
for i, v := range arr {
arr[i] = dict[v]
}
return arr
}
题目描述:
给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。
如果删除一个字母后,word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。
注意:
字母 x 的 频率 是这个字母在字符串中出现的次数。
你 必须 恰好删除一个字母,不能一个字母都不删除。
题解:
这个题看起来简单但实际上很坑,如果直接统计完频率就开始对比的话会有非常多种情况,ifelse几十行都写不完,特别复杂。通过统计频率的频率,模拟删除每一个频率的频率减一,频率减一的频率加一后,计算哈希表的长度,如果等于1就返回true
代码(Go):
func equalFrequency(word string) bool {
arr := [26]int{}
for _,v := range word {
arr[v - 'a']++
}
dict := map[int]int{}
for _,v := range arr {
if v > 0 {
dict[v]++
}
}
for _,v := range arr {
if v == 0 {
continue
}
dict[v]--
if dict[v] == 0{
delete(dict,v)
}
if v - 1 > 0 {
dict[v - 1]++
}
if len(dict) == 1 {
return true
}
if v - 1 > 0 {
dict[v - 1]--
if dict[v - 1] == 0 {
delete(dict,v - 1)
}
}
dict[v]++
}
return false
}
题目描述:
给你 2 枚相同 的鸡蛋,和一栋从第 1 层到第 n 层共有 n 层楼的建筑。
已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都 会碎 ,从 f 楼层或比它低 的楼层落下的鸡蛋都 不会碎 。
每次操作,你可以取一枚 没有碎 的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。
请你计算并返回要确定 f 确切的值 的 最小操作次数 是多少?
题解:
如果鸡蛋数量很多的话可以用动态规划,但是这个题只有两个鸡蛋,可以直接用数学方法做
代码(Go):
func twoEggDrop(n int) int {
for i := 1;i <= n;i++{
if i*(i + 1)/2 >= n{
return i
}
}
return -1
}
题目描述:
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。
子数组 是数组中的一个连续序列。
题解:
动态规划。因为子数组是连续序列,所以可以从前往后对比差值,如果差值相等则前面有几个等差数组就加等差数组的数量再加一
代码(Go):
func numberOfArithmeticSlices(nums []int) int {
n := len(nums)
re := 0
if n == 1 {
return re
}
dif,num := nums[0] - nums[1],0
for i := 2;i < n;i++{
if nums[i - 1] - nums[i] == dif {
num++
}else{
dif,num = nums[i - 1] - nums[i],0
}
re += num
}
return re
}
现在二维的动态规划能看懂一点但不多,自己写着还是很费劲,接下来依旧是动态规划