• 记录 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             
    

    总结

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

  • 相关阅读:
    ModuleNotFoundError: No module named ‘sklearn.cross_validation‘
    代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素
    annotationProcessorOptions注解处理器
    python-继承
    人工智能:群智能算法的一般框架、特点和不足
    第三届软件测试火焰杯比赛开启,可以报名啦!
    金仓数据库 KingbaseGIS 使用手册(4. 数据管理和查询)
    Vue3+Element Plus使用svg加载iconfont的解决方案
    计算机毕业设计(附源码)python重工教师职称管理系统
    经典卷积神经网络LeNet&AlexNet&VGG
  • 原文地址:https://blog.csdn.net/weixin_42269028/article/details/127040009