首页 > 其他分享 >[Leetcode Weekly Contest]351

[Leetcode Weekly Contest]351

时间:2023-07-10 21:23:20浏览次数:49  
标签:下标 351 Contest int max nums 数组 Leetcode dp

链接:LeetCode

[Leetcode]6451. 找出最大的可达成数字

给你两个整数 num 和 t 。
如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等,则称其为 可达成数字 :

  • 每次操作将 x 的值增加或减少 1 ,同时可以选择将 num 的值增加或减少 1 。

返回所有可达成数字中的最大值。可以证明至少存在一个可达成数字。

class Solution {
    public int theMaximumAchievableX(int num, int t) {
        return num + 2* t;
    }
}

[Leetcode]2770. 达到末尾下标所需的最大跳跃次数

给你一个下标从 0 开始、由 n 个整数组成的数组 nums 和一个整数 target 。
你的初始位置在下标 0 。在一步操作中,你可以从下标 i 跳跃到任意满足下述条件的下标 j :

  • 0 <= i < j < n
  • -target <= nums[j] - nums[i] <= target

返回到达下标 n - 1 处所需的 最大跳跃次数 。
如果无法到达下标 n - 1 ,返回 -1 。

动态规划:dp数组存储最大跳跃次数
对于当前i,寻找满足abs(nums[i] - nums[j]) <= target的所有j (0 <= j < i)
若存在这种j,找到其中dp[j]值最大的max
\(dp[i] = max + 1\)
否则
\(dp[i] = -1\)

class Solution {
    public int maximumJumps(int[] nums, int target) {
        int res = 0, n=nums.length;
        int[] dp = new int[n];
        for(int i=1;i<n;++i) {
            dp[i] = -1;
            for(int j=0;j<i;++j) {
                int diff = nums[j] - nums[i];
                if(diff >= -target && diff <= target) {
                    if(j == 0 || dp[j] > 0) dp[i] = Math.max(dp[i], dp[j]+1);
                }
            }
        }
        return dp[n-1];
    }
}

[Leetcode]2741. 特别的排列

  1. 构造最长非递减子数组
    给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,长度均为 n 。
    让我们定义另一个下标从 0 开始、长度为 n 的整数数组,nums3 。对于范围 [0, n - 1] 的每个下标 i ,你可以将 nums1[i] 或 nums2[i] 的值赋给 nums3[i] 。
    你的任务是使用最优策略为 nums3 赋值,以最大化 nums3 中 最长非递减子数组 的长度。
    以整数形式表示并返回 nums3 中 最长非递减 子数组的长度。
    注意:子数组 是数组中的一个连续非空元素序列。

动态规划.

class Solution {
    public int maxNonDecreasingLength(int[] nums1, int[] nums2) {
        int res = 1, n = nums1.length;
        int[][] dp = new int[n][2];
        dp[0][0] = 1;
        dp[0][1] = 1;
        for(int i=1;i<n;++i) {
            dp[i][0] = 1;
            dp[i][1] = 1;
            if(nums1[i] >= nums1[i-1]) dp[i][0] = Math.max(dp[i][0], dp[i-1][0]+1);
            if(nums1[i] >= nums2[i-1]) dp[i][0] = Math.max(dp[i][0], dp[i-1][1]+1);
            if(nums2[i] >= nums1[i-1]) dp[i][1] = Math.max(dp[i][1], dp[i-1][0]+1);
            if(nums2[i] >= nums2[i-1]) dp[i][1] = Math.max(dp[i][1], dp[i-1][1]+1);
            res = Math.max(res, dp[i][0]);
            res = Math.max(res, dp[i][1]);
        }
        return res;
    }
}

[Leetcode]2772. 使数组中的所有元素都等于零

给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。
你可以对数组执行下述操作 任意次 :

  • 从数组中选出长度为 k 的 任一 子数组,并将子数组中每个元素都 减去 1 。

如果你可以使数组中的所有元素都等于 0 ,返回  true ;否则,返回 false 。
子数组 是数组中的一个非空连续元素序列。

差分数组 & 贪心。
令 \(f(i)=a_i-a_{i-1}\),特别的,\(f(0)=a_0\), \(f(n)=−a_{n-1}\) 。数组 f 称为原数组的差分数组。

可以发现,差分数组具有以下性质:

  • 原数组中所有元素都等于零,等价于差分数组中所有元素都等于零。
  • 如果我们将原数组中以\(a_i\)为开头且长度为 \(k\) 的子数组中每个元素 −1,等价于 \(f(i)−1\),\(f(i+k)+1\)。这样我们就将子数组的运算转化为了单个元素的运算。
class Solution {
    public boolean checkArray(int[] nums, int k) {
        int n = nums.length;
        int[] f = new int[n+1];
        f[0] = nums[0];
        f[n] = -nums[n-1];
        for(int i=1;i<n;++i) {
            f[i] = nums[i] - nums[i-1];
        }
        for(int i=0;i<=n-k;++i) {
            if(f[i] < 0) return false;
            if(f[i] > 0) {
                f[i+k] += f[i];
                f[i] -= f[i];
            }
        }
        for(int i=0;i<=n;++i) if(f[i] != 0) return false;
        return true;
    }
}

参考:LeetCode

标签:下标,351,Contest,int,max,nums,数组,Leetcode,dp
From: https://www.cnblogs.com/hellojamest/p/17542362.html

相关文章

  • LeetCode 215. 数组中的第K个最大元素
    小根堆classSolution{public:intfindKthLargest(vector<int>&nums,intk){priority_queue<int,vector<int>,greater<int>>q;for(autox:nums){if(q.size()<k)q.push(x);......
  • AtCoder Regular Contest 164 (A-C)
    A.TernaryDecomposition思维难度其实可以作为第二题思路先考虑最优情况下需要多少个数来组成(不够就No)在考虑全部为1的情况下是否可行(N<K这种情况不行)剩下的情况,考虑每次把高位的1向下挪变为3,所需的数字+2那么即三进制拆分后,在[min,max]范围内,且与最优情况差值为......
  • #yyds干货盘点# LeetCode程序员面试金典:区域和检索 - 数组不可变
    1.简述:给定一个整数数组 nums,处理以下类型的多个查询:计算索引 left 和 right (包含left和right)之间的nums元素的和,其中 left<=right实现NumArray类:NumArray(int[]nums)使用数组nums初始化对象intsumRange(inti,intj)返回数组nums 中索引 left 和 r......
  • AtCoder Beginner Contest 309
    A:1#include<cstdio>2#include<cstring>3#include<algorithm>4#include<iostream>5#include<string>6#include<vector>7#include<stack>8#include<bitset>9#include<cstdlib>10#include......
  • AtCoder Beginner Contest 273 ABCD
    AtCoderBeginnerContest273A-ARecursiveFunctionProblemStatement题意:给你一个函数\(f(x)\)\(f(0)=1\)对于所有正整数\(k\),有\(f(k)=k*f(k-1)\)找到\(f(N)\)Solution思路:数据范围只有\(10\),直接递归。#include<bits/stdc++.h>usingnamespacestd;typede......
  • LeetCode 207. 课程表
    classSolution{public:boolcanFinish(intn,vector<vector<int>>&pre){if(pre.empty()||pre[0].empty())returntrue;vector<vector<bool>>g(n,vector<bool>(n,false));for(autoq:pre)......
  • AtCoder Beginner Contest 309
    感觉F写了个乱搞做法A-Nine(abc309A)题目大意给定一个\(3\times3\)的网格,以及两个数字。问这两个数字是否水平相邻。解题思路求出两个数字的横纵坐标,看是否横坐标相同,纵坐标差一即可。读题不仔细,开题就WA了。神奇的代码#include<bits/stdc++.h>usingnamespa......
  • LeetCode -- 792. 匹配子序列的单词数
     方法1:利用桶的思想同时匹配所有words中的子串(走路写法)把所有首字母相同的子串放入到一个桶中,然后遍历s,对于首字母为s[i]的单词,若其大小为1则res++,否则删掉s[i],并根据s[i+1]放入新的桶中。c++classSolution{public:intnumMatchingSubseq(strings,vecto......
  • LeetCode 206. 反转链表
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,ListNode*next):val(x),next(next......
  • AtCoder Grand Contest 058 D Yet Another ABC String
    洛谷传送门AtCoder传送门OrzH6_6Q,感谢他给我们带来了这道容斥好题。这个东西看起来很不好搞。可以尝试容斥。但是我们要容斥啥?钦定ABC不出现,其他任意?感觉还是很难算。观察不合法子串,发现它们很有特点。如果我们钦定\(\texttt{A}\)为\(0\),\(\texttt{B}\)为\(1\),\(\te......