1 旋转矩阵
记得zip时要map成list[list] 不然比起来会格式不对False
def findRotation(self, mat: List[List[int]], target: List[List[int]]) -> bool:
k = 0
n = len(mat)
while (k < 4): # 或者for _ in range(4)
mat[::] = list(map(list,zip(*mat[::-1])))
if mat == target: return True
"""这样比较好像不行
for i in range(n):
for j in range(n):
if mat[i][j] == target[i][j]:
return True
"""
k += 1
return False
c++
手动旋转
vector<vector<int>> f(vector<vector<int>> a)
{
auto b = a;
int n = a.size();
for (int i = 0; i < n; i++)
for (int j = 0, k = n - 1; j < n; j++,k--)
b[i][j] = a[k][i];
return b;
}
bool findRotation(vector<vector<int>>& a, vector<vector<int>>& b) {
int i = 0;
while (i < 4)
{
a = f(a);
if (a == b) return true;
i++;
}
return false;
}
2. 使得每个数相同,求操作数
排序后,找不同即可
cnt
来存当前(max->2nd_max)变了之后,下一位(2nd_max)的数量,这也是需要准备变成3rd_max的数,以此类推。
如果当前2nd_max重复数,也加进来。如果有多个(1st)max 首先加进cnt。
【原理】:让我想想,一会儿看录播 一次只能改成比他小一个的数(数列里), 所以
写反了,可恶。。。。
数列 | 8 | 6 | 6 | 6 | 5 | 5 | 4 | 1 |
---|---|---|---|---|---|---|---|---|
cnt | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8这个不用管了 |
res | 0 | +1 | +4 | +6 | +7 |
8先变6; res + 1
然后一共四个第二大的数6,都要变成第三大的数 ${4} * {“6”} -> {“5”}$ ,res + 4
然后一共4+2=6个5,都要变成第四大的数 ${6} * {“5”} -> {“4”}$ ,res + 6
然后一共6+1=7个4,都要变成第五大的数 ${7} * {“4”} -> {“1”}$ ,res + 7
自己推理也是ok的0-0(视频出的好慢啊)
def func(nums: List[int]):
ans = cnt = 0
nums.sort(reverse=1)
for i in range(len(nums)):
if i and nums[i] != nums[i-1]:
ans += cnt
cnt += 1
return ans
c++
int func(vector<int>& a){
int n = a.size();
sort(a.begin(), a.end());
int res = 0;
for (int i = 1, j = 0; i < n; i ++ ) {
if (a[i] != a[i - 1]) j ++ ;
res += j;
}
return res;