博主渣渣一枚,刷刷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. Linux 按 Ctrl + S 卡死的解决办法

    ctrl + s 的作用是暂停屏幕输出 ctrl + q 恢复屏幕输出即可 恢复之后会出现在暂停期间输入的字符

  2. electron初探问题总结

    使用electron时间不是很久,随着使用的深入慢慢的也遇到一些问题,下面总结一下遇到的问题与大家分享,避免趟坑. 主要问题汇总如下: webview与渲染进程renderer间通信 BrowserW ...

  3. Python 之列表切片的四大常用操作

    最近在爬一个网站的文档的时候,老师要求把一段文字切割开来,根据中间的文本分成两段 故学习了一段时间的切片操作,现把学习成果po上来与大家分享 1.何为切片? 列表的切片就是处理列表中的部分元素,是把整 ...

  4. 一起学Spring之基础篇

    本文主要讲解Spring的基础环境搭建以及演变由来,仅供学习分享使用,如有不足之处,还请指正. 什么是Spring ? Spring是一个开源框架,用来处理业务逻辑层和其他层之间的耦合问题.因此Spr ...

  5. jieba的使用

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

  6. 针对windows系统如何解决openssl_pkey_export(): cannot get key from parameter 1这个问题

    为了解决这个问题我百度了很多方法,可是很多方法并没有效果. 方法一: 如果你安装的是phpstudy这个集成环境,那么 1.你就要去php拓展里面去打开php_opemssl中打开这个扩展. 2.去p ...

  7. Change Style of Navigation Items 更改导航项的样式

    In this lesson, you will learn how to change the style of navigation items in a WinForms XAF applica ...

  8. GitLab-怎样使用GitLab托管项目

    场景 Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

  9. Angular中innerHTML标签的样式不起作用详解

    1.背景 在最近angular的项目中,需要用到[innerHTML]标签来指定一个div的样式: //HTML部分 <div class="contents" [inner ...

  10. PWA 学习笔记(四)

    Service Worker 简介: 1.Service Worker 是 PWA 技术基础之一,脱离浏览器主线程的特性,使得 Web App 离线缓存成为可能, 更为后台同步.通知推送等功能提供了思 ...