0
点赞
收藏
分享

微信扫一扫

力扣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)_c++

输入: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)_算法_02

输入:n = 7, left = [], right = [0,1,2,3,4,5,6,7]
输出:7
解释:所有蚂蚁都向右移动,下标为 0 的蚂蚁需要 7 秒才能从木板上掉落。
示例 3:

力扣OJ(1501-1600)_算法_03

输入: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. 连接所有点的最小费用

​​最小生成树​​

举报

相关推荐

0 条评论