Leetcode 周赛 200

统计好三元组

在这里插入图片描述
由 数 据 规 模 , 就 算 是 O ( n 3 ) 也 能 A C . . . 当 然 也 可 以 预 先 存 储 每 个 合 法 的 ( i , j ) 对 然 后 再 来 找 K 也 可 以 由数据规模,就算是O(n^3)也能AC...\\ 当然也可以预先存储每个合法的(i,j)对然后再来找K也可以 O(n3)AC...(i,j)K

class Solution:
    def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
        ans=0
        for i in range(len(arr)-2):
            for j in range(i+1,len(arr)-1):
                for k in range(j+1,len(arr)):
                    if abs(arr[i]-arr[j])<=a and abs(arr[j]-arr[k])<=b and abs(arr[i]-arr[k])<=c:
                        ans+=1
        return ans

找出数组游戏的赢家

在这里插入图片描述
数据规模:

2 <= arr.length <= 10^5
1 <= arr[i] <= 10^6
arr 所含的整数 各不相同 。
1 <= k <= 10^9

双 指 针 , 第 一 个 指 针 指 向 当 前 的 获 胜 者 , 第 二 个 指 针 指 向 挑 战 者 。 时 间 复 杂 度 为 O ( N ) , 第 一 圈 找 到 获 胜 者 , 第 二 圈 确 定 获 胜 者 双指针,第一个指针指向当前的获胜者,第二个指针指向挑战者。\\ 时间复杂度为O(N),第一圈找到获胜者,第二圈确定获胜者 O(N)

class Solution:
    def getWinner(self, arr: List[int], k: int) -> int:
        if k>=len(arr):
            return max(arr)
        
        cur=0
        p=1
        cnt=0
        while cnt<k:
            if arr[p]<arr[cur]:
                cnt+=1
            else:
                cur=p
                cnt=1
            
            p=(p+1)%len(arr)
        return arr[cur]

排布二进制网格的最少交换次数

在这里插入图片描述
数据规模:

n == grid.length
n == grid[i].length
1 <= n <= 200
grid[i][j] 要么是 0 要么是 1 。

结 果 三 十 分 钟 做 完 其 他 题 就 这 题 没 想 到 先 二 维 转 一 维 , 再 冒 泡 结果三十分钟做完其他题就这题没想到\\ 先二维转一维,再冒泡

class Solution:
    def minSwaps(self, grid: List[List[int]]) -> int:
        '''
        第一步,计算每一列的后缀0的个数,示例1为[0,1,2]
        '''
        g = []
        for l in grid:
            g.append(0)
            for i in l[::-1]:
                if i == 0:
                    g[-1] += 1
                else:
                    break
        '''
        第二步,对g数组使用冒泡算法,使得数组从大到小排列
        '''
        ans = 0
        for i in range(len(g)):
            for j in range(i, len(g)):
                if g[j] >= len(g) - i - 1:
                    ans += j - i
                    g = g[: i] + [g[j]] + g[i: j] + g[j + 1:]
                    break

            else:
                return -1
        return ans

最大得分

在这里插入图片描述
数据规模:

1 <= nums1.length <= 10^5
1 <= nums2.length <= 10^5
1 <= nums1[i], nums2[i] <= 10^7
nums1 和 nums2 都是严格递增的数组。

又到了我怎么过的T4,一头雾水时间
一开始不会用数据规模的第四条所以用的dp,状态转移方程是

i,k分别表示数组编号nums[k]中第i个数字
dp(i, k)=dp(i-1, k) + nums[k][i] # 若nums[k][i]不在另一个数组
        =max(dp(i-1, k),dp(j-1, 1-k)) + nums[k][i] # 若nums[k][i]在另一个数组,j为其对应下标

结果跑出来200M内存开销,但是还能AC就较为震惊
但是结合第4条就可以有双指针解法

1.整合两个数组 nums1 = [2,4,5,8,10], nums2 = [4,6,8,9]->[2,4,5,6,8,9,10]
2.设定两个值ans1,ans2=0,0分别表示两个数组当前最大值,类似dp(i,k)
3.顺序遍历newnums,若只在一个数组出现则只加给对应数组,若都出现则ans1,ans2同时设定为最大值
class Solution:
    def maxSum(self, nums1: List[int], nums2: List[int]) -> int:
        num1, num2= set(nums1),set(nums2)
        ans1,ans2=0,0
        for num in sorted(num1|num2):
            if num in num1 and num in num2:
                ans1=ans2=max(ans1,ans2)
            if num in num1:
                ans1+=num
            if num in num2:
                ans2+=num
        return max(ans1,ans2) %1000000007
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值