【蓝湖专场】力扣第 241 场周赛
作者:互联网
昨天晚上睡晚了,4点睡的,10点爬起来晕乎乎的打比赛
文章目录
第一题:5759. 找出所有子集的异或总和再求和
题目链接
题目简介
题目思路
- 直接爆搜出子集的个数,然后对每一个子集进行异或操作,最终进行求和。
题目代码
class Solution {
public int subsetXORSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> path = new ArrayList<>();
dfs(path, list, 0, nums);
int sum = 0;
for(int i = 0; i < list.size(); i++){
int num = 0;
List<Integer> list1 = list.get(i);
if(list1.size() == 0){
sum += num;
}else{
for(int j = 0; j < list1.size(); j++){
num = num ^ list1.get(j);
}
}
sum = sum + num;
}
return sum;
}
public void dfs(List<Integer> path, List<List<Integer>> list, int index, int[] nums){
list.add(new ArrayList<>(path));
if(index == nums.length){
return;
}
for(int i = index; i < nums.length; i++){
path.add(nums[i]);
dfs(path, list, i + 1, nums);
path.remove(path.size() - 1);
}
}
}
第二题:5760. 构成交替字符串需要的最小交换次数
题目链接
题目简介:
题目思路
- 我们可以想一下,最终我们需要转化成的
交替子串
,只有两种表达方式- 第一种:101010101
- 第二种:010101010
- 我们分三种情况:
- 第一种:当前字符串中
'0'
的个数大于'1'
的个数:- 这种情况的话,说明转化成的字符串必定是
'010101010'
这种形式,也就是奇数位是'1',偶数位是'0'
- 我们将原来的字符串与这种字符串进行比较,得出错位的
'0'
和'1'
的个数,假如错误的个数(cnt)
相等,那经过cnt
次交换即可得到交替字符串。 - 若是不相等:则不可能组成交替字符串
- 这种情况的话,说明转化成的字符串必定是
- 第二种:当前字符串中
'1'
的个数大于'0'
的个数:思路如上 - 第三种:当前字符串中
'0'
的个数等于'1'
的个数:- 这样的话,需要对两种都进行遍历,最后求一下最小值。
- 第一种:当前字符串中
题目代码
/*
比赛代码,有点粗糙
*/
public int minSwaps(String s) {
int size = s.length();
int res0 = 0;
int res1 = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '0') {
res0++;
} else {
res1++;
}
}
// 假设0的数量大于1的数量
// 01010
// 偶数为0,奇数为1
if (res0 > res1) {
int num1 = 0;
int num2 = 0;
for (int i = 0; i < s.length(); i++) {
if (i % 2 == 0 && s.charAt(i) == '1') {
num1++;
} else if (i % 2 == 1 && s.charAt(i) == '0') {
num2++;
}
}
if (num1 == num2) {
return num2;
} else {
return -1;
}
}
// 假设1的数量大于0的数量
// 1010101
// 偶数为1,奇数为0
if (res1 > res0) {
int num1 = 0;
int num2 = 0;
for (int i = 0; i < s.length(); i++) {
if (i % 2 == 0 && s.charAt(i) == '0') {
num1++;
} else if (i % 2 == 1 && s.charAt(i) == '1') {
num2++;
}
}
if (num1 == num2) {
return num2;
} else {
return -1;
}
}
// 两种都有可能
if (res0 == res1) {
int num1 = 0;
int num2 = 0;
for (int i = 0; i < s.length(); i++) {
if (i % 2 == 0 && s.charAt(i) == '1') {
num1++;
} else if (i % 2 == 1 && s.charAt(i) == '0') {
num2++;
}
}
int num3 = 0;
int num4 = 0;
for (int i = 0; i < s.length(); i++) {
if (i % 2 == 0 && s.charAt(i) == '0') {
num3++;
} else if (i % 2 == 1 && s.charAt(i) == '1') {
num4++;
}
}
if (num1 == num2 && num3 == num4) {
return Math.min(num1, num3);
} else if (num1 == num2) {
return num1;
} else if (num3 == num4) {
return num3;
} else {
return -1;
}
}
return -1;
}
第三题:5761. 找出和为指定值的下标对
题目链接
题目简介
题目思路
- 题目是一个模拟题,有三种操作:
- 实例化数组:直接赋值即可
- add:将我们
nums2
数组的值增加 - count:求
num1
和num2
中,加起来等于tot
的数值对
- 在求数值对的时候,我们可以暴力求解,利用双层for循环,提交的时候会发现超时,我们看给的数据范围:
- 1 <= nums1.length <= 1000
- 1 <= nums2.length <= 10^5
- 最多调用 add 和 count 函数各 1000 次
- 如果我们单纯暴力的话,时间复杂度为:1000 * 1000 * 10^5,直接超时
- 我们来考虑优化,
num1 + num2 = tot
,我们要找到num1
和num2
这两个数,我们不妨换一种思路,当num1
时,我们去找有没有等于'tot - num1'
的数字。 - 我们将
num2
中的元素存入到HashMap
中,直接遍历num1
寻找map
中有没有tot-num1
的数字。 - 时间复杂度为:1000 * 1000
题目代码
class FindSumPairs {
ArrayList<Integer> list1;
ArrayList<Integer> list2;
HashMap<Integer, Integer> map;
public FindSumPairs(int[] nums1, int[] nums2) {
list1 = new ArrayList<>();
list2 = new ArrayList<>();
map = new HashMap();
for(int i = 0; i < nums1.length; i++){
list1.add(nums1[i]);
}
for(int i = 0; i < nums2.length; i++){
list2.add(nums2[i]);
if(map.containsKey(nums2[i])){
int val = map.get(nums2[i]);
val++;
map.put(nums2[i], val);
}else{
map.put(nums2[i], 1);
}
}
}
public void add (int index, int val){
int num= list2.get(index);
int val2 = map.get(num);
val2--;
map.put(num, val2);
int sum = num + val;
list2.set(index, sum);
if (map.containsKey(sum)) {
int val1= map.get(sum);
val1++;
map.put(sum, val1);
} else {
map.put(sum, 1);
}
}
public int count(int tot) {
int sum = 0;
for(int i = 0; i < list1.size(); i++){
if(map.containsKey(tot - list1.get(i))){
sum += map.get(tot -list1.get(i));
}
}
return sum;
}
}
/**
* Your FindSumPairs object will be instantiated and called as such:
* FindSumPairs obj = new FindSumPairs(nums1, nums2);
* obj.add(index,val);
* int param_2 = obj.count(tot);
*/
标签:map,蓝湖,题目,num1,num2,int,力扣,++,241 来源: https://blog.csdn.net/qq_40915439/article/details/116892839