leetcode贪心算法题:
给定一个包含大写字母和小写字母的字符串 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
对于计算字符次数,完全可以用字符串自带函数,但是我忘记了有这个函数
给定一个长度为 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
计数。