记录 22.9.25 第312场周赛1~3

记录 22.9.25 第312场周赛1~3

   LC周赛 四道题拿下两道 继续努力! 第三道差一点,第四道 并查集 看不懂,继续学习吧!努力奋斗。

6188. 按身高排序

题目链接:6188. 按身高排序
题目大意:给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。
对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。请按身高 降序 顺序返回对应的名字数组 names 。

例如:

输入:names = ["Mary","John","Emma"], heights = [180,165,170]
输出:["Mary","Emma","John"]
解释:Mary 最高,接着是 Emma 和 John 。

输入:names = ["Alice","Bob","Bob"], heights = [155,185,150]
输出:["Bob","Alice","Bob"]
解释:第一个 Bob 最高,然后是 Alice 和第二个 Bob 。

解题思路:

  • 又只对了两道题 害! 还需努力啊
  • 这次 看到了 全世界排名的答题,这次第一用的 py3 可以好好学习一下了!
class Solution:
    def sortPeople(self, names: List[str], heights: List[int]) -> List[str]:

        # 自己的代码
        # 只想着取巧 使用函数 没成想忘了怎么用 真是。。。
        """
        hash_map = {}
        name_num = [i for i in range(len(names))]
        for a,b in zip(name_num,heights):
            hash_map[a]=b
        c = sorted(hash_map.items(),key=lambda x:x[1],reverse=True)
        return [names[i] for i,_ in c]
        """

        # 全世界排名第一的大神的代码 真的简洁明了
        l = [(j,i) for i,j in zip(names,heights)]
        l.sort(reverse=True)
        return [i[1] for i in l]

6189. 按位与最大的最长子数组

题目链接:6189. 按位与最大的最长子数组
题目大意:给你一个长度为 n 的整数数组 nums 。考虑 nums 中进行 按位与(bitwise AND)运算得到的值 最大 的 非空 子数组。

  • 换句话说,令 k 是 nums 任意 子数组执行按位与运算所能得到的最大值。那么,只需要考虑那些执行一次按位与运算后等于 k 的子数组。
    返回满足要求的 最长 子数组的长度。
    数组的按位与就是对数组中的所有数字进行按位与运算。子数组 是数组中的一个连续元素序列。

例如:

输入:nums = [1,2,3,3,2,2]
输出:2
解释:
子数组按位与运算的最大值是 3 。
能得到此结果的最长子数组是 [3,3],所以返回 2 。

输入:nums = [1,2,3,4]
输出:1
解释:
子数组按位与运算的最大值是 4 。 
能得到此结果的最长子数组是 [4],所以返回 1

解题思路:

  • 这道题 读了好几遍 才搞明白 这是找最值啊!
  • 害 这次代码写得还可以 很简洁明了。
class Solution:
    def longestSubarray(self, nums: List[int]) -> int:
        maxN = max(nums)
        n = len(nums)
        L,ans = 0,0
        while L<n:
            if nums[L] != maxN:
                L += 1
                continue
            else:
                R = L
                while R<n and nums[R] == maxN:
                    R += 1
                ans = max(ans,R-L)
            L = R+1
        return ans         

6190. 找到所有好下标

题目链接:6190. 找到所有好下标
题目大意:给你一个大小为 n 下标从 0 开始的整数数组 nums 和一个正整数 k 。对于 k <= i < n - k 之间的一个下标 i ,如果它满足以下条件,我们就称它为一个 好 下标:

  • 下标 i 之前 的 k 个元素是 非递增的 。
  • 下标 i 之后 的 k 个元素是 非递减的 。
    按 升序 返回所有好下标。

例如:

输入:nums = [2,1,1,1,3,4,1], k = 2
输出:[2,3]
解释:数组中有两个好下标:
- 下标 2 。子数组 [2,1] 是非递增的,子数组 [1,3] 是非递减的。
- 下标 3 。子数组 [1,1] 是非递增的,子数组 [3,4] 是非递减的。
注意,下标 4 不是好下标,因为 [4,1] 不是非递减的。

输入:nums = [2,1,1,2], k = 2
输出:[]
解释:数组中没有好下标。

解题思路:

  • 这道题本来想 暴力 发现超时
  • 我自己的处理方法是 方法(一)使用栈和牺牲空间 来处理
  • 注意两个 if 条件非常的重要 是我牺牲了数次机会得到的测试用例 害!
  • 方法(二) 是参考 本次排名世界第一的答题 真的太巧妙了 没想到啊!
  • 总之这道题 需要牺牲空间换时间 一定要好好思考这道题 不要再次类型题上在浪费时间。

方法(一)

class Solution:
    def goodIndices(self, nums: List[int], k: int) -> List[int]:

        # 自己的方法
        # AC了不知道 多少次 感觉给出的测试用例 纯纯地考验耐心!!!
        # 开头的两个 if 非常重要
        n = len(nums)
        if k==1: return [i for i in range(k,n-k)]
        if len(set(nums)) == 1: return [i for i in range(k,n-k)]
        l1,l2 = list(),list()
        stack = list()
        ans = list()
        for i in range(n):
            if i>n-k: break
            if len(stack)>=k:
                l1.append(i)
            if stack and stack[-1]<nums[i]:
                stack = list()
            stack.append(nums[i])
        stack = list()
        for i in range(n-1,-1,-1):
            if i<k: break
            if len(stack)>=k:
                l2.append(i)
            if stack and stack[-1]<nums[i]:
                stack = list()
            stack.append(nums[i])
        # if len(l1)>len(l2): l1,l2 = l2,l1
        for a in l1:
            if a in l2:
                ans.append(a)
        return ans          

方法(二)

class Solution:
    def goodIndices(self, nums: List[int], k: int) -> List[int]:

        n = len(nums)
        if k==1: return [i for i in range(k,n-k)]
        if len(set(nums)) == 1: return [i for i in range(k,n-k)]
        bef,after = [1]*n,[1]*n
        for i in range(1,n):
            if nums[i] <= nums[i-1]:
                bef[i] = bef[i-1]+1
        for i in range(n-2,-1,-1):
            if nums[i] <= nums[i+1]:
                after[i] = after[i+1]+1
        ans = list()
        for i in range(k,n-k):
            if bef[i-1] >= k and after[i+1] >= k:
                ans.append(i)
        return ans             

总结

  继续学习,还有好多不会的,抓紧时间。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值