力扣每日四题
- 2485. 找出中枢整数-简单
- 1935. 可以输入的最大单词数-简单
- 983. 最低票价-中等
- 357. 统计各位数字都不同的数字个数-中等
- 总结
2485. 找出中枢整数-简单
题目描述:
给你一个正整数 n ,找出满足下述条件的 中枢整数 x :
1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。
返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题目保证对于给定的输入,至多存在一个中枢整数。
题解:
双指针分别从前后向中间靠拢,计算前后部分的和是否相等。这个题有数学公式可以直接找出或判断,所以其实可以在O(1)时间复杂度内做出来
代码(Go):
func pivotInteger(n int) int {p,nump := 1,0q,numq := n,0for p <= q{if p == q{if nump == numq{return p}else{return - 1}}if nump < numq{nump += pp++}else{numq += qq--}}return -1
}
1935. 可以输入的最大单词数-简单
题目描述:
键盘出现了一些故障,有些字母键无法正常工作。而键盘上所有其他键都能够正常工作。
给你一个由若干单词组成的字符串 text ,单词间由单个空格组成(不含前导和尾随空格);另有一个字符串 brokenLetters ,由所有已损坏的不同字母键组成,返回你可以使用此键盘完全输入的 text 中单词的数目。
题解:
哈希表存储损坏字符,遍历输入字符查看是否损坏
代码(Go):
func canBeTypedWords(text string, brokenLetters string) int {s := strings.Split(text," ")dict := map[rune]int{}re := 0for _,v := range brokenLetters{dict[v] = 1}for _,v := range s{flag := 1for _,b := range v{if dict[b] == 1{flag = 0break}}if flag == 1{re++}}return re
}
983. 最低票价-中等
题目描述:
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。
火车票有 三种不同的销售方式 :
一张 为期一天 的通行证售价为 costs[0] 美元;
一张 为期七天 的通行证售价为 costs[1] 美元;
一张 为期三十天 的通行证售价为 costs[2] 美元。
通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张 为期 7 天 的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。
返回 你想要完成在给定的列表 days 中列出的每一天的旅行所需要的最低消费 。
题解:
这个题官方题解没太看懂,我和官方题解做法不一样。思路就是从后往前找时间点,票价总消费dp[i]应该在三个值里取最小,即上一次的消费加costs[0],七天内距今最远的消费加costs[1],30天内距今最远的消费加costs[2],实际上dp[i]在这里表示的是i天以前消费的总和,第i天要买什么票是取决于后面的
代码(Go):
func mincostTickets(days []int, costs []int) int {dp := make([]int,len(days) + 1)dp[0] = 0for i := 0;i < len(days);i++{temp7,temp30 := i,ifor j := 0;j < i;j++{if days[i] - days[j] < 7{temp7 = jbreak}}for j := 0;j < i;j++{if days[i] - days[j] < 30{temp30 = jbreak}}dp[i + 1] = min(dp[i] + costs[0],min(dp[temp7] + costs[1],dp[temp30] + costs[2]))}return dp[len(days)]
}func min(x int,y int) int {if x > y{return y}else{return x}
}
357. 统计各位数字都不同的数字个数-中等
题目描述:
给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10n 。
题解:
这个题有点像之前粉刷房子那个,不过这个更简单,本质是逐位选择数字,已选择过的数字不能再次被选择,把小于n位的数字数量都加起来
代码(Go):
func countNumbersWithUniqueDigits(n int) int {if n == 0 {return 1}if n == 1 {return 10}re, mul := 10, 9for i := 0;i < n - 1;i++ {mul *= 9 - ire += mul}return re
}
总结
动态规划的题变化太大了,每个题感觉思路都差很多,感觉只能靠多做多见靠经验来做了