博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教。题目及解法来自于力扣(LeetCode),传送门

算法:

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

解:

public class Solution {
public IList<int> SpiralOrder(int[][] matrix)
{
if (matrix.Length == )
{
return new List<int>();
} int minRow = ;
int minColumn = ;
int maxRow = matrix.GetLength() - ;
int maxColumn = matrix[].GetLength() - ; var seen = new List<List<bool>>(); for (int i = ; i <= maxRow; i++)
{
var x = new List<bool>(); for (int j = ; j <= maxColumn; j++)
{
x.Add(false);
} seen.Add(x);
} var dr = new int[] { , , , - };
var dc = new int[] { , , -, }; int r = , c = , di = ; var result = new List<int>(); for (int i = ; i < (maxRow + ) * (maxColumn + ); i++)
{
result.Add(matrix[r][c]);
seen[r][c] = true; var nextr = r + dr[di];
var nextc = c + dc[di]; if (nextr >= && nextr <= maxRow && nextc >= && nextc <= maxColumn && !seen[nextr][nextc])
{
r = nextr;
c = nextc;
}
else
{
di = (di + ) % ;
r = r + dr[di];
c = c + dc[di];
}
} return result;
}
}

  这道题说来惭愧,渣渣二狗一开始做出来的没有完全通过验证。仔细分析一下,重点在于解决“转向”所引发的问题。换句话说,如果单纯输出一行或一列,无论是正行或逆向都是很容易的。无非就是行索引或者列索引的自增或自减。上面的解法是官方给的一种思路。重点其实在于dr,dc,与di以及seen数组的定义。

  先来说说seen,这个数组是和要处理的数组matrix相同的规模,储存的内容表示对应的matrix节点有没有被访问过。当我们旋转行进的方向旋转了三次之后,放入result中的顺序其实是第一列由下自上的,这样再回到第[0][0]时,我们可以利用seen[0][0]判断出需要进行转向了。

  再来看看dr,dc与di。dr与dc可以理解为一个“向量”,表示当前在matrix中应该前进的方向。如第一组值,dr为0,dc为1,代表每次移动时向column的正向(→)移动。每当我们放入result中一个值之后,利用dr,dc与di来决定下一个要放入result中的值的行与列的索引。当行进至边界值时,我们获取到的新的索引nextr与nextc其实是不存在的,这时可以利用nextr与nextc与对应的边界进行比较来判断。一旦发生这种情况,我们就需要调整行进的方向,因此对di进行处理。

  二狗自己的代码想了想也决定贴出来,失败的原因在于两点:1.边界值没有好好想清楚,把问题复杂化。2.处理数据的逻辑与进行循环的变量交杂在一起,产生歧义与影响。

public class Solution {
public IList<int> SpiralOrder(int[][] matrix)
{
int minRow = ;
int minColumn = ;
int maxRow = matrix.GetLength() - ;
int maxColumn = matrix[].GetLength() - ; var seen = new List<List<bool>>(); for (int i = ; i <= maxRow; i++)
{
var x = new List<bool>(); for (int j = ; j <= maxColumn; j++)
{
x.Add(false);
} seen.Add(x);
} var dr = new int[] { , , , - };
var dc = new int[] { , , -, }; int r = , c = , di = ; var result = new List<int>(); for (int i = ; i < (maxRow + ) * (maxColumn + ); i++)
{
result.Add(matrix[r][c]);
seen[r][c] = true; var nextr = r + dr[di];
var nextc = c + dc[di]; if (nextr >= && nextr <= maxRow && nextc >= && nextc <= maxColumn && !seen[nextr][nextc])
{
r = nextr;
c = nextc;
}
else
{
di = (di + ) % ;
r = r + dr[di];
c = c + dc[di];
}
} return result;
}
}

数据库:

某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。

Customers 表:

+----+-------+
| Id | Name |
+----+-------+
| 1 | Joe |
| 2 | Henry |
| 3 | Sam |
| 4 | Max |
+----+-------+
Orders 表:

+----+------------+
| Id | CustomerId |
+----+------------+
| 1 | 3 |
| 2 | 1 |
+----+------------+
例如给定上述表格,你的查询应返回:

+-----------+
| Customers |
+-----------+
| Henry |
| Max |
+-----------+

解:

  很简单,就exists的简单应用。

select
c.Name as Customers
from Customers c
where not exists
(
Select *
from Orders o
where o.CustomerId = c.Id
)

  当然也可以用左连接或者not in的方式完成。

  

LeetCode刷题191118的更多相关文章

  1. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  2. leetcode 刷题进展

    最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多  前200的吃透了 足以应付非算法岗 ...

  3. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  4. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  5. LeetCode刷题总结之双指针法

    Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...

  6. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  7. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  8. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  9. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

随机推荐

  1. iOS 13 presentViewController

    升级了iOS 13,发现代码中使用presentViewController的都变成了这样的,顶部留了一部分 查看present样式,iOS 13 默认自动适配,需要在present的时候,设置sty ...

  2. php有必要用swoole吗

    在 Swoole 官网的自我介绍是“面向生产环境的 PHP 异步网络通信引擎”,首先 Swoole 它是一个网络应用的开发工具,它支持 Http.TCP.UDP.WebSocket. Swoole 和 ...

  3. keycloak搭配mysql

    下载 https://www.keycloak.org/downloads.html 到这里下载最新的服务器版本,本次文章指定版本为: 4.6.0.Final - 发行说明 安装 直接解压缩到某个目录 ...

  4. macbook无法下载软件问题解决

    今天新买了一台MacBook Pro,但是发现无法下载软件,在App Store中一直转圈圈. 方法:修改网络DNS为114.114.114.114和8.8.8.8,即可解决.

  5. 带你自行搭建虚拟机和Redis集群环境,值得收藏!

    前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...

  6. jieba的使用

    1. 分词 分词是自然语言处理中最基础的一个步骤.而jieba分词是中文分词的一个比较好的工具.下面看看可以怎么用jieba进行分词. import jieba # 全模式 seg_list1 = j ...

  7. 微服务-Springboot+Redis缓存管理接口代码实现

    废话少说,上代码,结合代码讲解: 一.创建maven工程:导入依赖: <packaging>war</packaging><!--修改jdk的版本--><pr ...

  8. Iterable与Collection源码学习

    接口 - Iterable<T> - 可迭代 描述 实现本接口的类,其对象可以被迭代.同时支持forEach语法 方法 Iterator<T> iterator() 类型 抽象 ...

  9. Zeus:1 Vulnhub Walkthrough

    主机层面扫描: ╰─ nmap -p1-65535 -sV -A 10.10.202.14 PORT STATE SERVICE VERSION21/tcp open ftp vsftpd 2.0.8 ...

  10. iPhone 启动页尺寸

    iPhone 启动页尺寸 4 640*960 5 640*1136 6 750*1334 6p 1242*2208