0224 algo todo:

✅ 766. 托普利茨矩阵

https://leetcode-cn.com/problems/toeplitz-matrix

描述

如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。

给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True。

示例 1:

输入:
matrix = [
  [1,2,3,4],
  [5,1,2,3],
  [9,5,1,2]
]
输出: True
解释:
在上述矩阵中, 其对角线为:
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"。
各条对角线上的所有元素均相同, 因此答案是True。
示例 2: 输入:
matrix = [
  [1,2],
  [2,2]
]
输出: False
解释:
对角线"[1, 2]"上的元素不同。
说明:  matrix 是一个包含整数的二维数组。
matrix 的行数和列数均在 [1, 20]范围内。
matrix[i][j] 包含的整数在 [0, 99]范围内。
进阶: 如果矩阵存储在磁盘上,并且磁盘内存是有限的,因此一次最多只能将一行矩阵加载到内存中,该怎么办?
如果矩阵太大以至于只能一次将部分行加载到内存中,该怎么办? 来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/toeplitz-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

思路: 判断 a[i][j] == a[i+1][j+1] 即可

只需判断:前行中除最后一个元素外剩余的元素完全等于后行中除第一个元素外剩余的元素。

cpp


py


✅ 566. 重塑矩阵

https://leetcode-cn.com/problems/reshape-the-matrix

描述

在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。

给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。

如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:

输入:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
输出:
[[1,2,3,4]]
解释:
行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。
示例 2: 输入:
nums =
[[1,2],
[3,4]]
r = 2, c = 4
输出:
[[1,2],
[3,4]]
解释:
没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵。
注意: 给定矩阵的宽和高范围在 [1, 100]。
给定的 r 和 c 都是正数。 来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reshape-the-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

如果 rc > matrix 所有元素的个数, 那么 返回原来的数组。

否则: 想办法排列之: malloc row
col 的空间,通过 for each(如果不是for each, 你会怎么办呢?因为要保持两个平面上的指针,一个是原数组平面的,一个是新的malloc平面的 ) 遍历原来的数组

java

class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
if (r*c > nums[0].length * nums.length) return nums;
// else we can have suitable room for nums
int[r][c] ret;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
// how to traverse in nums? todo tt2
}
}
}
}

one sol for tt2 is: use a common 平面指针 eg tmp:

class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
int tmp=0;
vector<vector<int>> res(r, vector<int> (c));
if (r * c != nums[0].size() * nums.size())
{
return nums;
}
else
{
for (int y = 0; y < r; y++)
{
for (int x = 0; x < c; x++)
{
tmp=y*c+x+1;
res[y][x]=nums[(tmp-0.1)/nums[0].size()][(tmp-1)%nums[0].size()];// tt2 here is the core.!!use tmp as the unified plane ptr
}
}
return res;
}
---or:
// much clear one:
class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
if (r * c != nums[0].size() * nums.size())
return nums;
vector<vector<int>> res(r, vector<int> (c));
int h = nums.size(), w = nums.front().size();
for (int i = 0; i < w * h; i++)
{
int cx=i%w,cy=i/w,tx=i%c,ty=i/c;
res[ty][tx]=nums[cy][cx];
}
return res;
}
};

py

class Solution:
def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]:
if len(nums) * len(nums[0]) != r * c: return nums
tmp = []
ret = []
for i in range(len(nums)):
tmp += nums[i]
for i in range(0, len(tmp), c):# `c` means we have step length: c
ret.append(tmp[i: i+c]) #
return ret
'''执行用时 :
168 ms
, 在所有 Python3 提交中击败了
17.16%
的用户
内存消耗 :
14.4 MB
, 在所有 Python3 提交中击败了
34.89%
的用户'''

✅ 637. 二叉树的层平均值

https://leetcode-cn.com/problems/average-of-levels-in-binary-tree

描述

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.

示例 1:

输入:
3
/ \
9 20
/ \
15 7
输出: [3, 14.5, 11]
解释:
第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].
注意: 节点值的范围在32位有符号整数范围内。 来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/average-of-levels-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

层序遍历 框架:

q.enque(root);
while(!q.isEmpty()) {
// we
if watcher == 0: {
watcher = len(q)
} // 取出队首 的元素 node
// 把 node 的 val 加入到 本行的 sum 中
// 如何判断 本行 的node 已经全部加入 sum 中了呢 ?我们需要一个 watcher
if --watcher == 0: # 本行的全部已经加入了
// 如果 本行 的node 已经全部 加入到 sum 中,那么就 计算这个行的平均值。avg
// 如何 计算 avg 呢?我们没有计数
// 并把 avg 加入 到 ret 列表中。
// 其他情况: 本行的node 还没有 全部 加入 sum 完全;那么继续sum += node.val
//并且,把node.left node.right 都 入队。
}

cpp


py

# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None class Solution:
def averageOfLevels(self, root: TreeNode) -> List[float]:
if root == None: return [0]
ret = []
que = []
que.append(root)
sum = 0
watcher = len(que)
counter = 0
while(len(que) != 0) :
sum = 0
counter = 0
watcher = len(que)
while counter < watcher:
node = que.pop(0)
sum += node.val
if node.left: que.append(node.left)
if node.right: que.append(node.right)
counter += 1
ret.append(sum / counter) return ret
'''
执行用时 :
88 ms
, 在所有 Python3 提交中击败了
19.58%
的用户
内存消耗 :
15.8 MB
, 在所有 Python3 提交中击败了
44.35%
的用户
'''

上述py 实际上 参考下面的 java. 而且 多个语言 都是使用 双 while, 而非 一个while + if 拦截

关于 一个while + if 拦截 可以参考另一篇 针对: 637. 二叉树的层平均值 的博文

java

 public List<Double> averageOfLevels(TreeNode root) {
List<Double> doubles = new ArrayList<>();
if (root == null) return doubles;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
double ave = 0;
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
ave += node.val;
}
ave = ave * 1.0d / size;
doubles.add(ave);
}
return doubles;
}

lc 0224的更多相关文章

  1. 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。

    laviewpbt  2014.8.4 编辑 Email:laviewpbt@sina.com   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以 ...

  2. “LC.exe”错误

    错误“LC.exe”已退出,代码为 -1. 可能的原因是: 这个第三方组件是个商业组件,他在组件的主使用类定义了 LicenseProvider(typeof(LicFileLicenseProvid ...

  3. 解决VS下“LC.exe已退出,代码为-1”问题

    今天使用VS2015开发一个Winform程序,手一抖拖错了一个第三方控件,然后将其去掉并删除相关的引用,结果导致了LC.exe错误:"Lc.exe已退出,代码为-1 ". 经过上 ...

  4. 解析.NET 许可证编译器 (Lc.exe) 的原理与源代码剖析

    许可证编译器 (Lc.exe) 的作用是读取包含授权信息的文本文件,并产生一个可作为资源嵌入到公用语言运行库可执行文件中的 .licenses 文件. 在使用第三方类库时,经常会看到它自带的演示程序中 ...

  5. Lc.exe已退出,代码为-1

    编译项目,出现提示"Lc.exe已退出,代码为-1" .   解决办法: 意思就是把licenses.licx这个文件里的内容删除,但是文件还在(此时是个空文件),发生这个问题的原 ...

  6. "LC.exe" exited with code -1 错误

    当打开一个VS程序时出现"LC.exe" exited with code -1错误,解决方法是: 删除licenses.licx文件即可

  7. LC.exe exited with code -1

    昨天从win8.1升级到win10之后, 一切还算顺利, 就是升级时间比较长. 但是快下班的时候 遇到一个问题, 是之前在win8.1上没遇到的, 首先代码win8.1 vs2013 上跑的时候一切正 ...

  8. vs2012编译出错“LC.exe”已退出解决方法

    “LC.exe”已退出,代码为 -1. 解决方法: 将项目Properties下的licenses.licx文件删除,重新编译即可.

  9. TT付款方式、前TT和后TT、LC信用证+TT付款方式

    TT付款方式是以外汇现金方式结算,由您的客户将款项汇至贵公司指定的外汇银行账号内,可以要求货到后一定期限内汇款. .T/T属于商业信用,也就是说付款的最终决定权在于客户.T/T分预付,即期和远期.现在 ...

随机推荐

  1. 自定义php-mysqli工具增强类,支持链式调用

    <?php /*数据库访问类,支持链式访问 *function table($table):表名 *function where($where):条件 *function field(...$f ...

  2. C++11 Lambda函数

    Lambda函数 C++11新增了lambda函数,其基本格式如下 [捕捉列表] (参数) mutable -> 返回值类型 {函数体} 说明 []是lambda的引出符,捕捉列表能够捕捉上下文 ...

  3. 设置DataGridView的单元格颜色

    RowPrePaint事件: private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArg ...

  4. 快捷键(二):VSCode

    1,打开命令板:F1或Ctrl+Chift+P 2,新建文件:Ctrl+N 3,文件间切换:Ctrl+Tab 4,新开界面:Ctrl+Shift+N 5,关闭当前窗口:Ctrl+W 6,关闭界面:Ct ...

  5. A task in a suit and a tie:paraphrase generation with semantic augmentation解读

    1.该算法核心:在seq2seq模型的编码器中增加语义的frame 和 roles 2.上图为算法整个流程: 1).首先输入一句话s,SLING会使用frame和role label注释输入语句s,然 ...

  6. dubbo+zookeeper搭建笔记

    参考博客: http://blog.csdn.net/u013142781/article/details/50396621#reply http://blog.csdn.net/u013142781 ...

  7. i.MX RT1010之FlexIO模拟SSI外设

    恩智浦的i.MX RT1010是跨界处理器产品,作为i.MX RT跨界MCU系列的一个新的切入点,i.MX RT1010是成本最低的LQFP封装方式与i.MX RT系列产品一贯的高性能和易用性的结合产 ...

  8. ViewModel、LiveData、DataBinding

    ViewModel ViewModel的引入 如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失.例如,应用的某个 Activity 中可能包含用户列表.因配置更改而重新创 ...

  9. Spring Boot 如何动态切换数据源

    本章是一个完整的 Spring Boot 动态数据源切换示例,例如主数据库使用 lionsea 从数据库 lionsea_slave1.lionsea_slave2.只需要在对应的代码上使用 Data ...

  10. k8s搭建

    K8s官方文档地址:https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/  如果用云主机部 ...