LeetCode 第 45 场双周赛
这次的比较简单叭
第一题: 5657. 唯一元素的和
因为出现一次的数字不止一个两个, 所以通过 哈希表 来找到出现过一次的数字
最后哈希表遍历统计即可
AC Code
class Solution {
public int sumOfUnique(int[] nums) {
int ans = 0;
Map<Integer, Integer> map = new HashMap<>();
int len = nums.length;
for(int i = 0; i < len; i++) {
int cnt = map.getOrDefault(nums[i], 0);
map.put(nums[i], cnt + 1);
}
for(Integer key : map.keySet()) {
if(map.get(key) == 1) ans += key;
}
return ans;
}
}
第二题: 5658. 任意子数组和的绝对值的最大值
前缀和
要找到子数组绝对值的最大和
得到数组的前缀和
然后所以答案就藏在 前缀和中 (最大值 - 最小值) 、最大值、最小值 之中
AC Code
class Solution {
public int maxAbsoluteSum(int[] nums) {
int len = nums.length;
int ans = 0;
for(int i = 1; i < len; i++) nums[i] += nums[i - 1];
System.out.println(Arrays.toString(nums));
int mx = -(int)1e5, mn = (int)1e5;
for(int i = 0; i < len; i++) {
if(nums[i] > mx) mx = nums[i];
if(nums[i] < mn) mn = nums[i];
}
// 最小值 (最大值 - 最小值) 最大值
return Math.max(Math.max(Math.abs(mn), mx - mn), Math.abs(mx));
}
}
直接模拟了下就过了。
首尾双指针,同时去掉所有相同字符的前后缀, 同时更新答案即可.
AC Code
class Solution {
public int minimumLength(String s) {
char[] cs = s.toCharArray();
int len = cs.length;
int left = 0, right = len - 1;
int ans = len;
while(left < right) {
char a = cs[left], b = cs[right];
if(a != b) break;
//
while(left < right && cs[left] == a) {
left++;
ans--;
}
while(left <= right && cs[right] == a) {
right--;
ans--;
}
}
return ans;
}
}
第四题: 5660. 最多可以参加的会议数目 II
AC Code