19.leetcode第220场周赛

作者:Maksim


题目一 reformat phone number

You are given a phone number as a string number. number consists of digits, spaces ’ ', and/or dashes ‘-’.

You would like to reformat the phone number in a certain manner. Firstly, remove all spaces and dashes. Then, group the digits from left to right into blocks of length 3 until there are 4 or fewer digits. The final digits are then grouped as follows:

  • 2 digits: A single block of length 2.
  • 3 digits: A single block of length 3.
  • 4 digits: Two blocks of length 2 each.

The blocks are then joined by dashes. Notice that the reformatting process should never produce any blocks of length 1 and produce at most two blocks of length 2.

Return the phone number after formatting.


Example 1:

Input: number = “1-23-45 6”
Output:“123-456”
Explanation: The digits are “123456”.
Step 1: There are more than 4 digits, so group the next 3 digits. The 1st block is “123”.
Step 2: There are 3 digits remaining, so put them in a single block of length 3. The 2nd block is “456”.
Joining the blocks gives “123-456”.


Example 2:

Input: number = “123 4-567”

Output: “123-45-67”

Explanation: The digits are “1234567”.
Step 1: There are more than 4 digits, so group the next 3 digits. The 1st block is “123”.
Step 2: There are 4 digits left, so split them into two blocks of length 2. The blocks are “45” and “67”.
Joining the blocks gives “123-45-67”.


Example 3:

Input: number = “123 4-5678”

Output: “123-456-78”

Explanation: The digits are “12345678”.
Step 1: The 1st block is “123”.
Step 2: The 2nd block is “456”.
Step 3: There are 2 digits left, so put them in a single block of length 2. The 3rd block is “78”.
Joining the blocks gives “123-456-78”.


Example 4:

Input: number = “12”
Output: “12”

Example 5:

Input: number = "–17-5 229 35-39475 "
Output: “175-229-353-94-75”

Constraints:

  • 2 <= number.length <= 100
  • number consists of digits and the characters ‘-’ and ’ '.
  • There are at least two digits in number.

题解

时间复杂度: O ( n ) O(n) O(n)

class Solution {
public:
    string reformatNumber(string number) {
        string ret = "",ans = "";
        for(auto c: number)
        {
            if(isdigit(c)) ret += c;
        }
        int n = ret.length();
        for(int i=0;i<n;)
        {
            if(n-i>4)
            {
                if(ans.length()) ans += '-';
                for(int j=0;j<3;j++) ans += ret[i++];
            }
            else if(n-i==4)
            {
                if(ans.length()) ans += '-';
                for(int j=0;j<2;j++) ans += ret[i++];
                if(ans.length()) ans += '-';
                for(int j=0;j<2;j++) ans += ret[i++];
            }
            else if(n-i==3)
            {
                if(ans.length()) ans += '-';
                for(int j=0;j<3;j++) ans += ret[i++];
            }
            else if(n-i==2)
            {
                if(ans.length()) ans += '-';
                for(int j=0;j<2;j++) ans += ret[i++];
            }
            else 
            {
                if(ans.length()) ans += '-';
                for(int j=0;j<1;j++) ans += ret[i++];
            }
        }
        return ans;
    }
};
模拟类型的简单题

题目二maximum erasure value

You are given an array of positive integers nums and want to erase a subarray containing unique elements. The score you get by erasing the subarray is equal to the sum of its elements.

Return the maximum score you can get by erasing exactly one subarray.

An array b is called to be a subarray of a if it forms a contiguous subsequence of a, that is, if it is equal to a[l],a[l+1],…,a[r] for some (l,r).


Example 1:

Input: nums = [4,2,4,5,6]

Output: 17

Explanation: The optimal subarray here is [2,4,5,6].


Example 2:

Input: nums = [5,2,1,2,5,2,1,2,5]

Output: 8

Explanation: The optimal subarray here is [5,2,1] or [1,2,5].

Constraints:

  • 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
  • 1 < = n u m s [ i ] < = 1 0 4 1 <= nums[i] <= 10^4 1<=nums[i]<=104

题解

思路:每次移动右指针,当某个数出现两次后,移动左指针到合法位置

时间复杂度: O ( n ) O(n) O(n)

class Solution {
public:
    int vis[10001];
    int maximumUniqueSubarray(vector<int>& nums) {
        int lef = 0, n = nums.size();
        int ans = 0, ret = 0;
        for(int i=0;i<n;i++)
        {
            vis[nums[i]]++;
            ret += nums[i];
            while(vis[nums[i]]>=2) 
            {
                vis[nums[lef]]--;
                ret -= nums[lef];
                lef++;
            }
            ans = max(ans,ret);
        }
        return ans;
    }
};

题目三 jump game vi

You are given a 0-indexed integer array nums and an integer k.

You are initially standing at index 0. In one move, you can jump at most k steps forward without going outside the boundaries of the array. That is, you can jump from index i to any index in the range [ i + 1 , m i n ( n − 1 , i + k ) ] [i + 1, min(n - 1, i + k)] [i+1,min(n1,i+k)] inclusive.

You want to reach the last index of the array (index n - 1). Your score is the sum of all n u m s [ j ] nums[j] nums[j] for each index j you visited in the array.

Return the maximum score you can get.


Example 1:

Input: nums = [1,-1,-2,4,-7,3], k = 2
Output: 7
Explanation: You can choose your jumps forming the subsequence [1,-1,4,3] (underlined above). The sum is 7.


Example 2:

Input: nums = [10,-5,-2,4,0,3], k = 3

Output: 17

Explanation: You can choose your jumps forming the
subsequence [10,4,3] (underlined above). The sum is 17.


Example 3:

Input: nums = [1,-5,-20,4,-1,3,-6,-3], k = 2

Output: 0


Constraints:

  • 1 < = n u m s . l e n g t h , k < = 1 0 5 1 <= nums.length, k <= 10^5 1<=nums.length,k<=105
  • − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 104<=nums[i]<=104

题目三 maximum erasure value

You are given an array of positive integers nums and want to erase a subarray containing unique elements. The score you get by erasing the subarray is equal to the sum of its elements.

Return the maximum score you can get by erasing exactly one subarray.

An array b is called to be a subarray of a if it forms a contiguous subsequence of a, that is, if it is equal to a[l],a[l+1],…,a[r] for some (l,r).


Example 1:

Input: nums = [1,-1,-2,4,-7,3], k = 2

Output: 7

Explanation: You can choose your jumps forming the subsequence [1,-1,4,3] (underlined above). The sum is 7.


Example 2:

Input: nums = [10,-5,-2,4,0,3], k = 3

Output: 17

Explanation: You can choose your jumps forming the subsequence [10,4,3] (underlined above). The sum is 17.


Example 3:

Input: nums = [1,-5,-20,4,-1,3,-6,-3], k = 2

Output: 0

Constraints:

  • 1 < = n u m s . l e n g t h , k < = 1 0 5 1 <= nums.length, k <= 10^5 1<=nums.length,k<=105
  • − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 104<=nums[i]<=104

题解

思路:单调队列优化DP

d p [ i ] = max ⁡ ( d p [ i − 1 ] , d o t s , d p [ i − k ] ) + n u m s [ i ] dp[i] = \max(dp[i-1],\\dots,dp[i-k])+nums[i] dp[i]=max(dp[i1],dots,dp[ik])+nums[i]

用单调队列来维护后连续k个dp值得最大值即可

时间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    int dp[100001],dq[100001];
    int maxResult(vector<int>& nums, int k) {
        int lef = 0, rig = 0, n = nums.size();
        dq[rig++] = 0;
        dp[0] = nums[0];
        for(int i = 1;i < n;i++)
        {
            dp[i] = nums[i] + dp[dq[lef]];
            while(lef < rig && i - dq[lef] + 1 >= k + 1) lef++;
            while(lef < rig && dp[dq[rig-1]] <= dp[i]) rig--;
            dq[rig++] = i;
        }
        return dp[n - 1];
    }
};

本文链接:19.leetcode第220场周赛

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值