leetcode第354场周赛 2 - 双指针 3 - 思维 4 - 待补

题目传送门

2779. 数组的最大美丽值

题意
给你一个数组和一个整数 k,数组里面每个数都只能操作一次:加上区间\([-k,k]\)里的数。问你最终由相等元素组成的最长子序列的长度
双指针的妙用!

思路
先排序,前后双指针取差值在2k之间的区间,此区间的所有数均可以操作为同一个数,ans统计最大值即为最终答案

代码

class Solution {
public:
	int maximumBeauty(vector<int>& a, int k) {
		sort(a.begin() , a.end());
		int ans = 1 , n = a.size();
		k <<= 1;
		for(int i = 0, j = 0; i < n; ++ i){
			while(a[i] > a[j] + k) ++ j;
			ans = max(ans, i - j + 1);
		}
		return ans;
	}
};

2780. 合法分割的最小下标

题意
定义支配元素为数组中出现次数 * 2 大于数组长度的数。请你将数组在某个下标处划分为两个数组,且数组左右的支配元素相同。无法分割返回 -1

思路
思路来自灵茶山艾府,关键在于发现,划分后左右的众数就是整体的众数
那么,$O(n) $ 找众数,$O(n) $判下标即可

代码

class Solution {
public:
	int minimumIndex(vector<int>& a) {
		unordered_map<int,int> cnt;
		for(auto x : a){
			++cnt[x];
		}
		unordered_map<int,int> t;
		int n = a.size();
		for(int i = 0; i < n; ++ i){
			++ t[a[i]];
			if(t[a[i]] * 2 > i + 1 && (cnt[a[i]] - t[a[i]]) * 2 > n - i - 1){
				return i;
			}
		}
		return -1;
	}
};
posted on 2023-07-24 23:20  Qiansui  阅读(7)  评论(0编辑  收藏  举报