力扣第 265 场周赛总结

该博客讨论了两个编程问题,分别是找到数组中满足特定条件的最小索引和链表中临界点的最大最小距离。在数组问题中,需要找到满足`i % 10 == nums[i]`的最小索引,而链表问题则要求找出局部极大值和极小值点之间的最大、最小距离。解决方案分别是对数组和链表进行遍历,找到符合条件的元素或临界点,并计算距离。
摘要由CSDN通过智能技术生成

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),使用了链表长度个空间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nepu_bin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值