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. layui-table 样式

    <!DOCTYPE html> <html> <head> <style> #lay-table { background-color: #fff; c ...

  2. vue生命周期钩子函数详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_35585701/article/ ...

  3. Window下cmd查看目录结构

    在Linux下通过安装tree可以查看文件的目录结构: tree -L 比如上面这个命令就是查看当前目录下的所有目录及文件,深度为2级. 在windows下也有同样的命令,如下使用 tree /f 查 ...

  4. 微信小程序UDP通信,注意点 接收 onMessage 收到的message是ArrayBuffer缓冲,不能直接输出,要另转String处理

    1.WXML 页面代码 <!--index.wxml--> <view class="container"> <view class="us ...

  5. Codeforces Round #622 C2.Skyscrapers (hard version)

    This is a harder version of the problem. In this version n≤500000n≤500000 The outskirts of the capit ...

  6. 511,display:inline-block什么时候不会显示间隙?

    (百科: 在CSS布局中,如果我们想要将一些元素在同一行显示,其中的一种方法就是把要同行显示的元素设置display属性为inline-block,但是你会发现这些同行显示的inline-block元 ...

  7. Git - Windows 下, gitbash 打开资源管理器

    1. 概述 windows 下 gitbash 打开 资源管理器 2. 场景 资源管理唤起 gitbash 步骤 进入目录 鼠标右击 在 弹出菜单 中, 找到 Git Bash Here 结果 打开一 ...

  8. vue中,怎么给data对象添加新的属性?(尼玛这面试题居然让我给碰上了。。。。)

    Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: <template> <div> <ul> <li v-for="v ...

  9. XFire调用CXF参数为Null的问题

    最近,领导分配了一个任务,做接口联调.情况是这样,对方客户升级了接口采用CXF,而我们还是用的XFire1.2.6,首先就遇到了这个问题:XFire调用CXF参数为Null的问题 . 在网上搜了一大堆 ...

  10. JDBC--处理Blob

    1.LOB(Large Objects)大对象,是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储多达4GB的数据) --LOB分类两种类型:1)内部LOB: 2)外部LOB: -- ...