5914. 值相等的最小索引
给你一个下标从 0 开始的整数数组 nums ,返回 nums 中满足 i mod 10 == nums[i] 的最小下标 i ;如果不存在这样的下标,返回 -1 。
x mod y 表示 x 除以 y 的 余数 。
示例 1:
输入:nums = [0,1,2]
输出:0
解释:
i=0: 0 mod 10 = 0 == nums[0].
i=1: 1 mod 10 = 1 == nums[1].
i=2: 2 mod 10 = 2 == nums[2].
所有下标都满足 i mod 10 == nums[i] ,所以返回最小下标 0
示例 2:
输入:nums = [4,3,2,1]
输出:2
解释:
i=0: 0 mod 10 = 0 != nums[0].
i=1: 1 mod 10 = 1 != nums[1].
i=2: 2 mod 10 = 2 == nums[2].
i=3: 3 mod 10 = 3 != nums[3].
2 唯一一个满足 i mod 10 == nums[i] 的下标
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 9
Solution
挨个判断即可。
class Solution {
public:
int smallestEqual(vector<int>& nums) {
for (int i = 0; i < nums.size(); ++i) {
if (i % 10 == nums[i])
return i;
}
return -1;
}
};
- 时间复杂度: O(N)
- 空间复杂度: O(1)
5915. 找出临界点之间的最小和最大距离
链表中的 临界点 定义为一个 局部极大值点 或 局部极小值点 。
如果当前节点的值 严格大于 前一个节点和后一个节点,那么这个节点就是一个 局部极大值点 。
如果当前节点的值 严格小于 前一个节点和后一个节点,那么这个节点就是一个 局部极小值点 。
注意:节点只有在同时存在前一个节点和后一个节点的情况下,才能成为一个 局部极大值点 / 极小值点 。
给你一个链表 head ,返回一个长度为 2 的数组 [minDistance, maxDistance] ,其中 minDistance 是任意两个不同临界点之间的最小距离,maxDistance 是任意两个不同临界点之间的最大距离。如果临界点少于两个,则返回 [-1,-1] 。
提示:
链表中节点的数量在范围 [2, 10^5] 内
1 <= Node.val <= 10^5
Solution
这里我使用了比较笨的方法,首先将所有节点的值都放到一个数组,然后对数组进行遍历判断,对满足极值条件的数进行记录。
class Solution {
public:
vector<int> nodesBetweenCriticalPoints(ListNode* head) {
ListNode* p = head;
vector<int> vec;
while (p) {
vec.push_back(p->val);
p = p->next;
}
int pre = 0;
int count = 0;
int first = 0;
int n = vec.size();
int dis = INT_MAX;
for (int i = 1; i < n - 1; ++i) {
int c = vec[i], p = vec[i - 1], n = vec[i + 1];
if (c > p && c > n || c < p && c < n) {
if (pre == 0) {
first = i;
}
else if (pre != 0)
dis = min(dis, i - pre);
pre = i;
++count;
}
}
if (count < 2)
return { -1,-1 };
return { dis, pre - first };
}
};
- 时间复杂度: O(N)
- 空间复杂度: O(N),使用了链表长度个空间。