leetcode 第 277 场周赛
元素计数
题目
给你一个整数数组
nums
,统计并返回在 nums
中同时具有一个严格较小元素和一个严格较大元素的元素数目。示例 1:
输入:nums = [11,7,2,15]
输出:2
解释:元素 7 :严格较小元素是元素 2 ,严格较大元素是元素 11 。
元素 11 :严格较小元素是元素 7 ,严格较大元素是元素 15 。
总计有 2 个元素都满足在 nums 中同时存在一个严格较小元素和一个严格较大元素。示例 2:
输入:nums = [-3,3,3,90]
输出:2
解释:元素 3 :严格较小元素是元素 -3 ,严格较大元素是元素 90 。
由于有两个元素的值为 3 ,总计有 2 个元素都满足在 nums 中同时存在一个严格较小元素和一个严格较大元素。提示:
-
1 <= nums.length <= 100
-
-105 <= nums[i] <= 105
思路:
找到数组中的最大值和最小值,除去最大值和最小值之后,剩余的元素即为同时具有一个严格较小元素和一个严格较大元素的元素。
代码:
class Solution {
public:
int countElements(vector<int>& nums) {
int minNum = *min_element(nums.begin(),nums.end());
int maxNum = *max_element(nums.begin(),nums.end());
int ans=0;
// for(int i=0;i<nums.size();i++){
// if(nums[i]>minNum &&nums[i]<maxNum){
// cnt++;
// }
//
for (auto num : nums) {
if (num > minNum && num < maxNum) {
ans++;
}
}
return ans;
}
};
按符号重排数组
题目:
给你一个下标从 0 开始的整数数组
nums
,数组长度为 偶数 ,由数目相等的正整数和负整数组成。你需要 重排
nums
中的元素,使修改后的数组满足下述条件:
- 任意连续的两个整数符号相反
- 对于符号相同的所有整数,保留它们在
nums
中的顺序。- 重排后数组以正整数开头。
重排元素满足上述条件后,返回修改后的数组。
示例 1:
输入:nums = [3,1,-2,-5,2,-4]
输出:[3,-2,1,-5,2,-4]
解释:
nums 中的正整数是 [3,1,2] ,负整数是 [-2,-5,-4] 。
重排的唯一可行方案是 [3,-2,1,-5,2,-4],能满足所有条件。
像 [1,-2,2,-5,3,-4]、[3,1,2,-2,-5,-4]、[-2,3,-5,1,-4,2] 这样的其他方案是不正确的,因为不满足一个或者多个条件。示例 2:
输入:nums = [-1,1]
输出:[1,-1]
解释:
1 是 nums 中唯一一个正整数,-1 是 nums 中唯一一个负整数。
所以 nums 重排为 [1,-1] 。提示:
-
2 <= nums.length <= 2 * 105
-
nums.length
是偶数-
1 <= |nums[i]| <= 105
-
nums
由相等数量的正整数和负整数组成
思路:
1.定义两个指针,一个指向奇数下标,一个指向偶数下标,
2.定义一个存储最终重排之后的数组
3.循环遍历数组,当遇到的数为正整数放在偶数下标下,遇到负整数,放在奇数下标下标下。
代码:
class Solution {
public:
vector<int> rearrangeArray(vector<int>& nums) {
int n = nums.size();
int i=0,j=1;
vector<int> res(n);
for(auto num:nums){
if(num>=0){
res[i]=num;
i+=2;
}
else{
res[j] = num;
j+=2;
}
}
return res;
}
};
找出数组中的所有孤独数字
题目:
给你一个整数数组
nums
。如果数字 x
在数组中仅出现 一次 ,且没有 相邻 数字(即,x + 1
和 x - 1
)出现在数组中,则认为数字 x
是 孤独数字 。返回
nums
中的 所有 孤独数字。你可以按 任何顺序 返回答案。示例 1:
输入:nums = [10,6,5,8]
输出:[10,8]
解释:
- 10 是一个孤独数字,因为它只出现一次,并且 9 和 11 没有在 nums 中出现。
- 8 是一个孤独数字,因为它只出现一次,并且 7 和 9 没有在 nums 中出现。
- 5 不是一个孤独数字,因为 6 出现在 nums 中,反之亦然。
因此,nums 中的孤独数字是 [10, 8] 。
注意,也可以返回 [8, 10] 。示例 2:
输入:nums = [1,3,5,3]
输出:[1,5]
解释:
- 1 是一个孤独数字,因为它只出现一次,并且 0 和 2 没有在 nums 中出现。
- 5 是一个孤独数字,因为它只出现一次,并且 4 和 6 没有在 nums 中出现。
- 3 不是一个孤独数字,因为它出现两次。
因此,nums 中的孤独数字是 [1, 5] 。
注意,也可以返回 [5, 1] 。
思路:
这题的题目很好懂,但是就是不知道该用什么样子的结构进行处理,看了别人的代码用了hash存储
1.先对nums数组进行扫描,将出现过的数在mp中进行加1操作
2.然后遍历mp,如果mp中的value等于一说明之前有在nums中出现过,然后需要判断k+1,k-1是否出现在过(即对mp里面的值是否为1进行判断)
3.若k+1,k-1不在,就记录在新的数组中
代码:
class Solution {
public:
vector<int> findLonely(vector<int>& nums) {
map<int,int> mp;
vector<int> res;
//现将nums中出现的数字进行加一操作
for(auto x:nums){
mp[x]++;
}
for(auto &[k,v]:mp){
if(v==1){
//如果mp中的值为1就说明之前在nums中出现过,所以需要进行对出现过的值,进行判断
if(!mp.count(k+1) &&!mp.count(k-1)){
//k + 1 和 k - 1未出现在数组中,满足题目条件,进行记录
res.push_back(k);
}
}
}
return res;
}
};
基于陈述统计最多好人数
题目:
游戏中存在两种角色:
- 好人:该角色只说真话。
- 坏人:该角色可能说真话,也可能说假话。
给你一个下标从 0 开始的二维整数数组
statements
,大小为 n x n
,表示 n
个玩家对彼此角色的陈述。具体来说,statements[i][j]
可以是下述值之一:
-
0
表示i
的陈述认为j
是坏人。-
1
表示i
的陈述认为j
是好人。-
2
表示i
没有对j
作出陈述。另外,玩家不会对自己进行陈述。形式上,对所有
0 <= i < n
,都有 statements[i][i] = 2
。根据这
n
个玩家的陈述,返回可以认为是 好人 的 最大 数目。示例 1:
输入:statements = [[2,1,2],[1,2,2],[2,0,2]]
输出:2
解释:每个人都做一条陈述。
- 0 认为 1 是好人。
- 1 认为 0 是好人。
- 2 认为 1 是坏人。
以 2 为突破点。
- 假设 2 是一个好人:
- 基于 2 的陈述,1 是坏人。
- 那么可以确认 1 是坏人,2 是好人。
- 基于 1 的陈述,由于 1 是坏人,那么他在陈述时可能:
- 说真话。在这种情况下会出现矛盾,所以假设无效。
- 说假话。在这种情况下,0 也是坏人并且在陈述时说假话。
- 在认为 2 是好人的情况下,这组玩家中只有一个好人。
- 假设 2 是一个坏人:
- 基于 2 的陈述,由于 2 是坏人,那么他在陈述时可能:
- 说真话。在这种情况下,0 和 1 都是坏人。
- 在认为 2 是坏人但说真话的情况下,这组玩家中没有一个好人。
- 说假话。在这种情况下,1 是好人。
- 由于 1 是好人,0 也是好人。
- 在认为 2 是坏人且说假话的情况下,这组玩家中有两个好人。
在最佳情况下,至多有两个好人,所以返回 2 。
注意,能得到此结论的方法不止一种。示例 2:
输入:statements = [[2,0],[0,2]]
输出:1
解释:每个人都做一条陈述。
- 0 认为 1 是坏人。
- 1 认为 0 是坏人。
以 0 为突破点。
- 假设 0 是一个好人:
- 基于与 0 的陈述,1 是坏人并说假话。
- 在认为 0 是好人的情况下,这组玩家中只有一个好人。
- 假设 0 是一个坏人:
- 基于 0 的陈述,由于 0 是坏人,那么他在陈述时可能:
- 说真话。在这种情况下,0 和 1 都是坏人。
- 在认为 0 是坏人但说真话的情况下,这组玩家中没有一个好人。
- 说假话。在这种情况下,1 是好人。
- 在认为 0 是坏人且说假话的情况下,这组玩家中只有一个好人。
在最佳情况下,至多有一个好人,所以返回 1 。
注意,能得到此结论的方法不止一种。提示:
-
n == statements.length == statements[i].length
-
2 <= n <= 15
-
statements[i][j]
的值为0
、1
或2
-
statements[i][i] == 2