天天看点

力扣OJ(1501-1600)

目录

​​1502. 判断能否形成等差数列​​

​​1503. 所有蚂蚁掉下来前的最后一刻​​

​​1504. 统计全 1 子矩形​​

​​1512. 好数对的数目​​

​​1513. 仅含 1 的子串数​​

​​1559. 二维网格图中探测环​​

​​1568. 使陆地分离的最少天数​​

​​1584. 连接所有点的最小费用​​

1502. 判断能否形成等差数列

给你一个数字数组 arr 。

如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。

如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。

示例 1:

输入:arr = [3,5,1]

输出:true

解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。

示例 2:

输入:arr = [1,2,4]

输出:false

解释:无法通过重新排序得到等差数列。

提示:

2 <= arr.length <= 1000

-10^6 <= arr[i] <= 10^6

class Solution {
public:
  bool canMakeArithmeticProgression(vector<int>& arr) {
    sort(arr.begin(), arr.end());
    int k = arr[1] - arr[0];
    for(int i = 2; i < arr.size(); i++)if (arr[i] - arr[i - 1] - k)return false;
    return true;
  }
};      

1503. 所有蚂蚁掉下来前的最后一刻

有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。

当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改变移动方向并继续移动。假设更改方向不会花费任何额外时间。

而当蚂蚁在某一时刻 t 到达木板的一端时,它立即从木板上掉下来。

给你一个整数 n 和两个整数数组 left 以及 right 。两个数组分别标识向左或者向右移动的蚂蚁在 t = 0 时的位置。请你返回最后一只蚂蚁从木板上掉下来的时刻。

示例 1:

力扣OJ(1501-1600)

输入:n = 4, left = [4,3], right = [0,1]

输出:4

解释:如上图所示:

-下标 0 处的蚂蚁命名为 A 并向右移动。

-下标 1 处的蚂蚁命名为 B 并向右移动。

-下标 3 处的蚂蚁命名为 C 并向左移动。

-下标 4 处的蚂蚁命名为 D 并向左移动。

请注意,蚂蚁在木板上的最后时刻是 t = 4 秒,之后蚂蚁立即从木板上掉下来。(也就是说在 t = 4.0000000001 时,木板上没有蚂蚁)。

示例 2:

力扣OJ(1501-1600)

输入:n = 7, left = [], right = [0,1,2,3,4,5,6,7]

输出:7

解释:所有蚂蚁都向右移动,下标为 0 的蚂蚁需要 7 秒才能从木板上掉落。

示例 3:

力扣OJ(1501-1600)

输入:n = 7, left = [0,1,2,3,4,5,6,7], right = []

输出:7

解释:所有蚂蚁都向左移动,下标为 7 的蚂蚁需要 7 秒才能从木板上掉落。

示例 4:

输入:n = 9, left = [5], right = [4]

输出:5

解释:t = 1 秒时,两只蚂蚁将回到初始位置,但移动方向与之前相反。

示例 5:

输入:n = 6, left = [6], right = [0]

输出:6

提示:

1 <= n <= 10^4

0 <= left.length <= n + 1

0 <= left[i] <= n

0 <= right.length <= n + 1

0 <= right[i] <= n

1 <= left.length + right.length <= n + 1

left 和 right 中的所有值都是唯一的,并且每个值 只能出现在二者之一 中。

class Solution {
public:
  int getLastMoment(int n, vector<int>& left, vector<int>& right) {
    int ans = 0;
    for (int i = 0; i < left.size(); i++)ans = max(ans, left[i]);
    for (int i = 0; i < right.size(); i++)ans = max(ans, n-right[i]);
    return ans;
  }
};      

1504. 统计全 1 子矩形

1512. 好数对的数目

给你一个整数数组 ​

​nums​

​ 。

如果一组数字 ​

​(i,j)​

​​ 满足 ​

​nums[i]​

​​ == ​

​nums[j]​

​​ 且 ​

​i​

​​ < ​

​j​

​ ,就可以认为这是一组 好数对 。

返回好数对的数目。

示例 1:

输入:nums = [1,2,3,1,1,3]
输出:4
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始      

示例 2:

输入:nums = [1,1,1,1]
输出:6
解释:数组中的每组数字都是好数对      

示例 3:

输入:nums = [1,2,3]
输出:0      

提示:

  • ​1 <= nums.length <= 100​

  • ​1 <= nums[i] <= 100​

class Solution {
public:
    int numIdenticalPairs(vector<int>& nums) {
        int ans=0;
        for(int i=0;i<nums.size();i++)for(int j=i+1;j<nums.size();j++)ans+=(nums[i]==nums[j]);
        return ans;
    }
};      

1513. 仅含 1 的子串数

给你一个二进制字符串 ​

​s​

​(仅由 '0' 和 '1' 组成的字符串)。

返回所有字符都为 1 的子字符串的数目。

由于答案可能很大,请你将它对 10^9 + 7 取模后返回。

示例 1:

输入:s = "0110111"
输出:9
解释:共有 9 个子字符串仅由 '1' 组成
"1" -> 5 次
"11" -> 3 次
"111" -> 1 次      

示例 2:

输入:s = "101"
输出:2
解释:子字符串 "1" 在 s 中共出现 2 次      

示例 3:

输入:s = "111111"
输出:21
解释:每个子字符串都仅由 '1' 组成      

示例 4:

输入:s = "000"
输出:0      

提示:

  • ​s[i] == '0'​

    ​​ 或​

    ​s[i] == '1'​

  • ​1 <= s.length <= 10^5​

class Solution {
public:
    int numSub(string s) {
        int len=0,ans=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]-'0')len++;
            else len=0;
            ans+=len,ans%=1000000007;
        }
        return ans;
    }
};      

1559. 二维网格图中探测环

1568. 使陆地分离的最少天数

1584. 连接所有点的最小费用

继续阅读