从零开始的力扣刷题记录-第十九天

文章介绍了力扣(LeetCode)中的几道编程题目,包括将数字转换为Excel列名称、求二进制数组中最大连续1的个数、寻找数组中元素的下一个更大元素、找出字符串中最长的回文子串以及计算能盛最多水的容器的面积。题解涉及遍历、哈希表、单调栈和双指针等算法思想。
摘要由CSDN通过智能技术生成

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
}

总结

中等题难度明显上升,没做出来那个题做了很久,感觉中等题开始就不像简单题那样大部分都可以无脑套算法了,不仅需要用到一些通用的算法,还需要根据具体问题具体分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值