力扣
一.数组能形成多少数对
1.原题链接:力扣
2.解题思路:
1. 先用哈希表统计数组nums中每种元素出现的个数
2.遍历哈希表,用answer[0]和answer[1]分别记录出现了多少个数对和剩余的元素,最后输出即可;
3.参考代码:
class Solution {
public:
vector<int> numberOfPairs(vector<int>& nums) {
map<int, int>mp;
for(auto & x : nums)mp[x]++;
vector<int>answer(2);
for(auto & m : mp){
answer[0] += m.second / 2;
answer[1] += m.second % 2;
}
return answer;
}
};
二.数位和相等数对的最大和
1.原题链接:力扣
2.解题思路:
1.将数位和相同的元素放到一个数组里
2.因为要取最大的两位数,所以对原先得到数组进行排序。遍历每个和数组,如果数组的元素大于等于2位数,则存在两个数相加的答案,设置ret为-1,如果数组只有一个元素,则ret还是-1,直接返回
3.参考代码:
class Solution {
public:
int maximumSum(vector<int> & nums) {
vector<vector<int>> arr(100);
sort(nums.begin(), nums.end());
for(int num:nums)
{
int val = num;
int sum = 0;
while(val != 0)
{
sum = sum + val % 10;
val /= 10;
}
arr[sum].push_back(num);
}
int ret = -1;
for(vector<int> a:arr)
{
if(a.size() >= 2)
{
ret = max(a[a.size() - 1] + a[a.size() - 2], ret);
}
}
return ret;
}
};
AcWing
一.吃饭
1.原题链接:4494. 吃饭 - AcWing题库
2.解题思路:
如果饭的份数和饮料瓶数多于或等于小朋友的人数,则说明每个小朋友都可以分到至少一份饭和一瓶饮料,则输出Yes,反之输出No
3.参考代码:
#include<iostream>
using namespace std;
int main()
{
int n, m, k;
cin >> n >> m >> k;
if(m >=n && k >= n)cout << "Yes";
else cout << "No";
return 0;
}
二.数组操作
1.原题链接:4495. 数组操作 - AcWing题库
2.解题思路:
因为对a数组每次的操作是减去最小的元素,所以只要对a数组进行一次排序即可找到每次最小元素的位置,再开一个数组b储存要输出的最小元素,注意b数组的元素可能为0,只要筛出大于0的元素先输出即可,将大于0的元素存入c数组,循环k次输出即可
3.参考代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,k;
const int N = 1e8 + 10;
int a[N], b[N], c[N];
int an = 0, bns = 0;
int main()
{
cin >> n >> k;
memset(c, 0, k);
for(int i = 0;i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
b[0] = a[0];
for(int i = 1; i < n; i++)
{
b[i] = a[i] - a[i - 1];
}
for(int i = 0; i < n; i++)
{
if(b[i] > 0)
{
c[an] = b[i];
an++;
}
}
for(int i = 0; i < k; i++)
{
cout << c[i] << endl;
}
return 0;
}