院校机试刷题第十三天:代码随想录算法训练营第七天
一、回顾代码随想录算法训练营第七天
1.454四数相加
1.1解题思路
利用哈希表将四层for转换为两层for,寻找对应的元素是否在map中
关键就是四层for循环太复杂了,时空消耗太大了,所以最好退化为两层for循环,也就是将四数之和变为两数之和,先将前两个数的和统计到map中,初始化map;然后遍历后两个数组得到c + d的和,因为a + b = 0 - c - d;所以就在map中找有没有key是 0 - c - d的,如果有的话,那么就统计这个key对应的value,统计到总和中即可,最终返回这个总和
1.2代码
class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> umap;for(int a : nums1) {for(int b : nums2) {umap[a + b]++;}}int count1 = 0;for(int c : nums3) {for(int d : nums4) {if(umap.find(0 - c - d) != umap.end()) {count1 += umap[0 - c - d];}}}return count1;}
};
2.15三数之和
关键要理解双指针法,因为这里有去重的可能性,所以要考虑到位出现重复如何处理。去重:排序,遇到相同的元素就跳过。
注意边界条件,一切针对left和right的行为都要基于left < right这个条件,否则执行left++,right--的时候,会出现left和right越界的情况。
3.18四数之和
和三数之和思路一样
积累语法
if((long) nums[i] + nums[j] + nums[left] + nums[right] < target) left++;
这里的(long)将nums[i]操作数类型强制转换为long,以防止数据太大无法处理。同时编译器将会将所有的剩余其他操作数同样也隐式转换为long类型。
二、P1328生活大爆炸版石头剪刀布
1.解题思路
这些题目真的是完全没有算法,全靠模拟,可以定义两个数组元素是重复值的数组,将别的元素都进行编码,并且编码定义胜负规则。
1.根据规律数组取余定义所有的数组
2.定义胜负规则
3.进行数组的遍历,同时求双方的得分。
2.代码
#include <iostream>
#include <vector>
using namespace std;int main() {int N, NA, NB;cin >> N >> NA >> NB;vector<int> guilvA(NA, 0);vector<int> guilvB(NB, 0);for(int i = 0; i < NA; i++) {cin >> guilvA[i];}for(int j = 0; j < NB; j++) {cin >> guilvB[j];}int sumA = 0;int sumB = 0;// 给数组赋重复变化的元素的值vector<int> A(N, 0);vector<int> B(N, 0);for(int i = 0; i < N; i++) {A[i] = guilvA[i % NA];B[i] = guilvB[i % NB];}for(int i = 0; i < N; i++) {if(A[i] == B[i]) continue;if(A[i] == 0 && B[i] == 1) sumB++;if(A[i] == 0 && B[i] == 2) sumA++;if(A[i] == 0 && B[i] == 3) sumA++;if(A[i] == 0 && B[i] == 4) sumB++;if(A[i] == 1 && B[i] == 0) sumA++;if(A[i] == 1 && B[i] == 2) sumB++;if(A[i] == 1 && B[i] == 3) sumA++;if(A[i] == 1 && B[i] == 4) sumB++;if(A[i] == 2 && B[i] == 0) sumB++;if(A[i] == 2 && B[i] == 1) sumA++;if(A[i] == 2 && B[i] == 3) sumB++;if(A[i] == 2 && B[i] == 4) sumA++;if(A[i] == 3 && B[i] == 0) sumB++;if(A[i] == 3 && B[i] == 1) sumB++;if(A[i] == 3 && B[i] == 2) sumA++;if(A[i] == 3 && B[i] == 4) sumA++;if(A[i] == 4 && B[i] == 0) sumA++;if(A[i] == 4 && B[i] == 1) sumA++;if(A[i] == 4 && B[i] == 2) sumB++;if(A[i] == 4 && B[i] == 3) sumB++;}cout << sumA << ' ' << sumB;return 0;
}