168. Excel表列名称-简单
题目描述:
给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。
题解:
这题主要坑点就在于他不是从0开始的,而是从1开始的所以在传统的方法之前需要先减一
代码(Go):
func convertToTitle(columnNumber int) string {
var s string
var re string
for columnNumber > 0{
temp := (columnNumber - 1)%26
columnNumber = (columnNumber - 1)/26
s += string(temp + int('A'))
}
for i := len(s) - 1;i >= 0;i--{
re += string(s[i])
}
return re
}
485. 最大连续 1 的个数-简单
题目描述:
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
题解:
昨天后两道题的究极弱化版,思路一样,直接遍历一次,用两个变量存储最大值和当前值
代码(Go):
func findMaxConsecutiveOnes(nums []int) int {
temp,flag := 0,0
for i := 0;i < len(nums);i++{
if nums[i] == 1{
temp++
}else{
if temp > flag{
flag = temp
}
temp = 0
}
}
if temp > flag{
flag = temp
}
return flag
}
496. 下一个更大元素 I-简单
题目描述:
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。
给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。
返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。
题解:
只会暴力解。官方解用到了单调栈,之前没接触过,第一次见,所有寻找下一个更大元素的题都可以用这种方法解。大致思路就是先不去管nums1而是寻找nums2中每个元素的下一个最大元素并存入哈希表中,这样就避免了同时遍历两个数组造成的时间浪费。而难点在于如何在O(n)的时间复杂度内找到nums2中每个元素的下一个最大元素,这一步就是用到了单调栈,从后向前遍历数组,遇到更小的元素就说明当前栈顶就是下一个最大元素,遇到更大的元素就进栈,每个元素仅需进栈出栈一次。
代码(Go):
func nextGreaterElement(nums1, nums2 []int) []int {
m, n := len(nums1), len(nums2)
re := make([]int, m)
for i, num := range nums1 {
j := 0
for j < n && nums2[j] != num {
j++
}
k := j + 1
for k < n && nums2[k] < nums2[j] {
k++
}
if k < n {
re[i] = nums2[k]
} else {
re[i] = -1
}
}
return re
}
5.最长回文子串-中等
题目描述:
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
题解:
没解出来,最多一次通过了七分之四的用例。看官方题解,感觉最好懂的还是中心拓展算法,我解题的时候思路其实差不多,但是没想到从中心向两边拓展,而是从两侧向中间对比,就导致极其复杂,最后也没把各种条件考虑明白
11. 盛最多水的容器-中等
题目描述:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
题解:
双指针,用两个指针分别指向数组两侧,数据小的那一个指针向中间移动,因为数据小的那个指针如果不移动的话,无论大的那个指针怎么移动,容积一定是减小的,所以保持这种移动并记录最大值即可
代码(Go):
func maxArea(height []int) int {
p := 0
q := len(height) - 1
max := 0
for p < q{
min := 0
temp := 0
if height[p] < height[q]{
min = height[p]
temp = min * (q - p)
p++
}else{
min = height[q]
temp = min * (q - p)
q--
}
if temp > max{
max = temp
}
}
return max
}
总结
中等题难度明显上升,没做出来那个题做了很久,感觉中等题开始就不像简单题那样大部分都可以无脑套算法了,不仅需要用到一些通用的算法,还需要根据具体问题具体分析