-
Notifications
You must be signed in to change notification settings - Fork 0
2023‐08‐13 第 358 场周赛
Help edited this page Aug 13, 2023
·
1 revision
- 没注意到数对这个条件
/*
[84,91,18,59,27,9,81,33,17,58] 165
*/
class Solution {
public:
int maxSum(vector<int>& nums) {
// 最大的一对数
unordered_map<int, int> cnt; // 最大数位相同的个数
unordered_map<int, int> sum; // 最大数位相同的和
unordered_map<int, vector<int>> vec; // 相同数位 对
for (int i = 0; i < nums.size(); i ++) {
int idx = INT_MIN;
int n = nums[i];
while (n) {
idx = max(idx, n % 10);
n /= 10;
}
vec[idx].emplace_back(nums[i]);
}
int res = -1;
for (auto [k, v] : vec) {
if (v.size() > 1) {
sort(v.begin(), v.end());
int f = v.size() - 1;
res = max(res, v[f] + v[f - 1]);
}
}
return res;
}
};
- 数字溢出导致罚时
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
/*
[0]
[9,1,9,5,0,5,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]
*/
class Solution {
public:
ListNode* doubleIt(ListNode* head) {
// 数据溢出 long long 溢出
// 还是得用 数组乘法
long long num = 0;
ListNode* res = new ListNode(0);
vector<int> idx; // 原链表数字
while (head != nullptr) {
idx.emplace_back(head -> val);
head = head -> next;
}
reverse(idx.begin(), idx.end());
vector<int> idx_2; // 原链表翻倍后的数字
int cnt = 0; // 进位
for (int i = 0; i < idx.size(); i ++) {
int n = idx[i] * 2 + cnt; // 数字
cnt = n / 10;
idx_2.emplace_back(n % 10);
}
if (cnt != 0) idx_2.emplace_back(cnt);
// num *= 2;
// if (num == 0) return res;
// while (num) {
// idx.emplace_back(num % 10);
// num /= 10;
// }
reverse(idx_2.begin(), idx_2.end());
ListNode* c = res;
for (int i = 0; i < idx_2.size(); i ++) {
ListNode* tem = new ListNode(0);
tem -> val = idx_2[i];
c -> next = tem;
c = tem;
}
return res -> next;
}
};
- 这个题看着挺简单的
- 暴力肯定会超时 但是想不到其他的方法
- 想用滑动窗口 或者 双指针 但是卡住了
- lower_bound
class Solution {
public:
int minAbsoluteDifference(vector<int> &nums, int x) {
int ans = INT_MAX, n = nums.size();
set<int> s = {INT_MIN / 2, INT_MAX}; // 哨兵
for (int i = x; i < n; i++) {
s.insert(nums[i - x]);
int y = nums[i];
auto it = s.lower_bound(y);
ans = min(ans, min(*it - y, y - *--it));
}
return ans;
}
};