1.21刷题日记:贪心算法

leetcode贪心算法题:

409. 最长回文串

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。

在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。

示例 1:

输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

下面代码自己写的:

class Solution:
    def longestPalindrome(self, s: str) -> int:
        count = {}
        for c in s:
            if c not in count:
                count[c] = 0
            count[c] += 1
        res=0
        j=0
        for i in count:
            if count[i]%2==0:
                res+=count[i]
            elif count[i]>1:
                res+=count[i]-1
                j=1
            elif count[i]==1 :
                j=1
        return res+j
            

运行最快的:

class Solution:
    def longestPalindrome(self, s: str) -> int:
        _dict = {}
        for x in set(s):
            _dict[x] = s.count(x)
        
        ans = 0
        for k,v in _dict.items():
            if v % 2 == 0:
                ans += v
            else:
                ans += v // 2 * 2
                if ans % 2 == 0:
                    ans += 1

        return ans

对于计算字符次数,完全可以用字符串自带函数,但是我忘记了有这个函数

45. 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i] 
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

自己写的:

class Solution:
    def jump(self, nums: List[int]) -> int:
        res=0
        n=len(nums)
        def toj(i, j, nums:List[int])->int:
            min_toj = j
            for x in range(i, j):
                if nums[x] + x >= j:
                    min_toj = min(min_toj, x)
                    return min_toj
            return min_toj
        x=n-1
        step=0
        while x!=0:
            x=toj(0,x,nums)
            step+=1
        return step

最快的:

class Solution:
    def jump(self, nums: List[int]) -> int:
        end, max_pos = 0, 0
        steps = 0
        for i in range(len(nums) - 1):
            max_pos = max(max_pos, nums[i] + i)
            if i == end:
                end = max_pos
                steps += 1
        return steps

思想:遍历数组 nums 的元素(除了最后一个元素)。对于每个位置 i,更新 max_pos 为当前位置能够到达的最远位置(即 nums[i] + i)和之前的 max_pos 中的较大值。当遍历到位置 i 时,如果 i 等于当前跳跃范围的最远位置 end,说明已经到达了上一次跳跃的边界。此时更新 end 为新的 max_pos,表示扩大下一次跳跃的范围,并增加 steps 计数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值