lcr177.撞色搭配
位运算
class Solution {
public:
vector<int> sockCollocation(vector<int>& sockets)
{
int xorans = 0;
int size = sockets.size();
for(int i = 0 ; i < size; i++){
xorans ^= socketsi;
}
int mask = xorans & (-xorans);
int one = 0,two = 0;
for(int i = 0 ; i < size; i++){
if(socketsi & mask){
one ^= socketsi;
}else{
two ^= socketsi;
}
}
return vector<int>{one,two};
}
};
lc1129.bfs
queue<pii>的抽象
和visnodecolor的check
class Solution {
typedef pair<int, int> pii;
vector<vector<pii>> g;
int n = 0;
public:
vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) {
this->n = n;
g.resize(n);
for (auto& e : redEdges)
ge\[0].push_back({e1, 0});
for (auto& e : blueEdges)
ge\[0].push_back({e1, 1});
vector<int> ans(n, -1);
ans0 = 0;
for (int i = 1; i < n; i++) {
ansi = bfs(0, i);
}
return ans;
}
int bfs(int start, int end) {
queue<pair<int, int>> q;
vector<vector<bool>> vis(n, vector<bool>(2, false));
q.push({start, -1});
int ret = 0;
while (!q.empty()) {
int sz = q.size();
for (int i = 0; i < sz; i++) {
auto curNode, lastC = q.front();
q.pop();
if (curNode == end) {
return ret;
}
for (auto nextNode, edgeC : gcurNode) {
++if ((lastC == -1 || edgeC != lastC) && !visnextNodeedgeC) {++
visnextNodeedgeC = true;
q.push({nextNode, edgeC});
}
}
}
ret++;
}
return -1;
}
};
lc765.
贪心,i+=2的移动
即++遍历2i,check 安排保证2*i+1 换到正确位置++

class Solution {
public:
int minSwapsCouples(vector<int>& row) {
int n = row.size();
unordered_map<int, int> h;
for (int i = 0; i < n; i++)
hrow\[i] = i;
int res = 0;
for (int i = 0; i < n; i += 2) {
int x = rowi;
int p = x % 2 ? x - 1 : x + 1;
if (rowi + 1 != p) {
res++;
int pos = hp;
int t = rowi + 1;
rowi + 1 = p;
rowpos = t;
ht = pos;
hp = i + 1;
}
}
return res;
}
};
lcp56. memo优化tle
或者改用bfs
class Solution {
int m, n;
int dx4 = {0, 0, 1, -1};
int dy4 = {1, -1, 0, 0};
public:
int conveyorBelt(vector<string>& matrix, vector<int>& start, vector<int>& end)
{
int ret = INT_MAX;
m = matrix.size();
n = matrix0.size();
vector<vector<bool>> vis(m, vector<bool>(n, false));
visstart\[0]start\[1] = true;
function<void(int, int, int)> dfs = \&(int a, int b, int cnt)
{
if(cnt>=ret) return;
if (a == end0 && b == end1)
{
ret = min(ret, cnt);
return;
}
for (int k = 0; k < 4; k++)
{
int x = a + dxk, y = b + dyk;
if (x >= 0 && y >= 0 && x < m && y < n && !visxy)
{
int op = cnt;
if (check(k) != matrixab)
op++;
visxy = true;
dfs(x, y, op);
visxy = false;
}
}
};
dfs(start0, start1, 0);
return ret;
}
char check(int k)
{
if (k == 0) return '>';
if (k == 1) return '<';
if (k == 2) return 'v';
return '^';
}
};
lc3015.
法1:暴力bfs,数据范围only 100,可以过
法2:++加入了x,y,可以思考加入的x,y影响了什么呢? 通过数学找规律++
class Solution {
public:
vector<int> countOfPairs(int n, int x, int y) {
vector<int> ret(n, 0);
for (int i = 1; i <= n; ++i) {
for (int j = i + 1; j <= n; ++j) {
// 计算三种可能路径的最短距离
int direct = j - i;
++int viaX = abs(i - x) + 1 + abs(j - y);
int viaY = abs(i - y) + 1 + abs(j - x);++
int minDist = min({direct, viaX, viaY});
retminDist - 1 += 2;
}
}
return ret;
}
};
assign
assign 是容器(比如 vector)的一个接口
++作用:清空容器原来的内容,然后放入新的元素。++
打个比方,就像你有一个盒子, assign(n, false) 就相当于:
-
- 先把盒子里原来的东西全倒掉
-
- 再往盒子里放 n 个 false
这样能确保容器里的内容是全新的,不会有之前残留的数据,避免出错。
lc523.同余定理
两个注意点
- 同余定理:余数相同的两个数,做差可被整除。--前缀和
- hash存mod,不可以用set,因为要保证len大于等于2,所以要存idx映射
!!还有对于全选和全不选的两个边界,下标初始化处理
同余定理就是说:两个整数 a 和 b,如果除以同一个正整数 m 后余数相同,就称 a 和 b 对 m 同余,简单记成 a ≡ b (mod m) ,大白话就是"除以 m 剩得一样" 。
比如 17 和 5 除以 6 都余 5,就说 17 和 5 对 6 同余 。则(17-5)%6=0,++余数相同的两个数,做差可被整除。++
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k)
{
int n=nums.size();
vector<int> f(n+1,0);
for(int i=0;i<n;i++)
{
++fi+1=fi+numsi;++
}
unordered_map<int,int> hash;
++hash0=0;++
for(int i=0;i<=n;i++)
{
int mod=fi%k;
if(hash.count(mod))
{
if(i-hashmod>=2)
return true;
}
else
hashmod=i;
}
return false;
}
};
lc1423.
***++滑动窗口➕正难则反(++***用滑动窗口,就要转化为连续部分才能滑~)
++取两边最大->转化为中间最小++
喜提tle....
class Solution {
vector<int> card;
int n=0,k=0,ret=0;
public:
int maxScore(vector<int>& cardPoints, int k)
{
card=cardPoints;
this->k=k;
n=cardPoints.size();
dfs(0,n-1,0,0);
return ret;
}
void dfs(int b,int e,int sum,int cnt)
{
if(cnt==k)
{
ret=max(ret,sum);
return;
}
dfs(b,e-1,sum+carde,cnt+1);
dfs(b+1,e,sum+cardb,cnt+1);
}
};
滑动窗口,正难则反
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
int ret=INT_MAX,sum=0;
int l=0,r=0;
int n=cardPoints.size();
int w=n-k;
int tt=0;
for(auto& c:cardPoints)
tt+=c;
while(r<n)
{
sum+=cardPointsr;
r++;
if(r-l==w)
{
ret=min(ret,sum);
sum-=cardPointsl;
l++;
}
}
int ans=tt-ret;
if(ret==INT_MAX) ans=tt;
return ans;
}
};