[Swift]LeetCode1030. 距离顺序排列矩阵单元格 | Matrix Cells in Distance Order

We are given a matrix with R rows and C columns has cells with integer coordinates (r, c), where 0 <= r < R and 0 <= c < C.

Additionally, we are given a cell in that matrix with coordinates (r0, c0).

Return the coordinates of all cells in the matrix, sorted by their distance from (r0, c0) from smallest distance to largest distance.  Here, the distance between two cells (r1, c1) and (r2, c2) is the Manhattan distance, |r1 - r2| + |c1 - c2|.  (You may return the answer in any order that satisfies this condition.)

Example 1:

Input: R = 1, C = 2, r0 = 0, c0 = 0
Output: [[0,0],[0,1]]
Explanation: The distances from (r0, c0) to other cells are: [0,1]

Example 2:

Input: R = 2, C = 2, r0 = 0, c0 = 1
Output: [[0,1],[0,0],[1,1],[1,0]]
Explanation: The distances from (r0, c0) to other cells are: [0,1,1,2]
The answer [[0,1],[1,1],[0,0],[1,0]] would also be accepted as correct.

Example 3:

Input: R = 2, C = 3, r0 = 1, c0 = 2
Output: [[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
Explanation: The distances from (r0, c0) to other cells are: [0,1,1,2,2,3]
There are other answers that would also be accepted as correct, such as [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]].

Note:

  1. 1 <= R <= 100
  2. 1 <= C <= 100
  3. 0 <= r0 < R
  4. 0 <= c0 < C


给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C

另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。

返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)

示例 1:

输入:R = 1, C = 2, r0 = 0, c0 = 0
输出:[[0,0],[0,1]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1]

示例 2:

输入:R = 2, C = 2, r0 = 0, c0 = 1
输出:[[0,1],[0,0],[1,1],[1,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2]
[[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。

示例 3:

输入:R = 2, C = 3, r0 = 1, c0 = 2
输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2,2,3]
其他满足题目要求的答案也会被视为正确,例如 [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]。

提示:

  1. 1 <= R <= 100
  2. 1 <= C <= 100
  3. 0 <= r0 < R
  4. 0 <= c0 < C


Runtime: 480 ms

Memory Usage: 20.5 MB

  1 class Solution {
  2     func allCellsDistOrder(_ R: Int, _ C: Int, _ r0: Int, _ c0: Int) -> [[Int]] {
  3         //var arr:[[Int]] = [[Int]](repeating:[Int](repeating:0,count:C),count:R)
  4         //优先队列
  5         var q = Heap<(Int,[Int])>.init { (f, s) -> Bool in
  6             return f.0 < s.0
  7         }
  8
  9         for i in 0..<R
 10         {
 11             for j in 0..<C
 12             {
 13                 q.insert((getManhattan([r0,c0],[i,j]),[i,j]))
 14             }
 15         }
 16         var res:[[Int]] = [[Int]]()
 17         while(!q.isEmpty)
 18         {
 19             res.append(q.remove()!.1)
 20         }
 21         return res
 22     }
 23
 24     func getManhattan(_ p1:[Int],_ p2:[Int]) -> Int
 25     {
 26         return Int(abs(Double(p1[0] - p2[0])) + abs(Double(p1[1] - p2[1])))
 27     }
 28 }
 29
 30 public struct Heap<T> {
 31     public var nodes = [T]()
 32     private var orderCriteria: (T, T) -> Bool
 33
 34     public init(sort: @escaping (T, T) -> Bool) {
 35         orderCriteria = sort
 36     }
 37
 38     public init(array: [T], sort: @escaping (T, T) -> Bool) {
 39         self.orderCriteria = sort
 40         configureHeap(from: array)
 41     }
 42
 43     public var isEmpty: Bool {
 44         return nodes.isEmpty
 45     }
 46
 47     public var count: Int {
 48         return nodes.count
 49     }
 50
 51     public mutating func configureHeap(from array: [T]) {
 52         nodes = array
 53         for i in stride(from: nodes.count / 2 - 1, through: 0, by: -1) {
 54             shiftDown(i)
 55         }
 56     }
 57
 58     public mutating func reset() {
 59         for i in stride(from: nodes.count / 2 - 1, through: 0, by: -1) {
 60             shiftDown(i)
 61         }
 62     }
 63
 64     @inline(__always) internal func parentIndex(ofIndex index: Int) -> Int {
 65         return (index - 1) / 2
 66     }
 67
 68     @inline(__always) internal func leftChildIndex(ofIndex index: Int) -> Int {
 69         return index * 2 + 1
 70     }
 71
 72     @inline(__always) internal func rightChildIndex(ofIndex index: Int) -> Int {
 73         return index * 2 + 2
 74     }
 75
 76     public func peek() -> T? {
 77         return nodes.first
 78     }
 79
 80     internal mutating func shiftUp(_ index: Int) {
 81         var childIndex = index
 82         let child = nodes[childIndex]
 83         var parentIndex = self.parentIndex(ofIndex: index)
 84         while childIndex > 0 && orderCriteria(child, nodes[parentIndex]) {
 85             nodes[childIndex] = nodes[parentIndex]
 86             childIndex = parentIndex
 87             parentIndex = self.parentIndex(ofIndex: childIndex)
 88         }
 89         nodes[childIndex] = child
 90     }
 91
 92     internal mutating func shiftDown(from index: Int, until endIndex: Int) {
 93         let leftChildIndex = self.leftChildIndex(ofIndex: index)
 94         let rightChildIndex = self.rightChildIndex(ofIndex: index)
 95
 96         var first = index
 97         if leftChildIndex < endIndex && orderCriteria(nodes[leftChildIndex], nodes[first]) {
 98             first = leftChildIndex
 99         }
100         if rightChildIndex < endIndex && orderCriteria(nodes[rightChildIndex], nodes[first]) {
101             first = rightChildIndex
102         }
103         if first == index {
104             return
105         }
106         nodes.swapAt(index, first)
107         shiftDown(from: first, until: endIndex)
108     }
109
110     internal mutating func shiftDown(_ index: Int) {
111         shiftDown(from: index, until: nodes.count)
112     }
113
114     public mutating func insert(_ value: T) {
115         nodes.append(value)
116         shiftUp(nodes.count - 1)
117     }
118
119     public mutating func insert<S: Sequence>(_ sequence:S) where S.Iterator.Element == T {
120         for value in sequence {
121             insert(value)
122         }
123     }
124
125     public mutating func replace(index i: Int, value: T) {
126         guard i < nodes.count else {
127             return
128         }
129         remove(at: i)
130         insert(value)
131     }
132
133     @discardableResult
134     public mutating func remove() -> T? {
135         guard !nodes.isEmpty else {
136             return nil
137         }
138         if nodes.count == 1 {
139             return nodes.removeLast()
140         } else {
141             let value = nodes[0]
142             nodes[0] = nodes.removeLast()
143             shiftDown(0)
144             return value
145         }
146     }
147
148     @discardableResult
149     public mutating func remove(at index: Int) -> T? {
150         guard index < nodes.count else { return nil}
151         let size = nodes.count - 1
152         if index != size {
153             nodes.swapAt(index, size)
154             shiftDown(from: index,  until: size)
155             shiftUp(index)
156         }
157         return nodes.removeLast()
158     }
159
160     public mutating func sort() -> [T] {
161         for i in stride(from: self.nodes.count - 1, to: 0, by: -1) {
162             nodes.swapAt(0, i)
163             shiftDown(from: 0, until: i)
164         }
165         return nodes
166     }
167 }

原文地址:https://www.cnblogs.com/strengthen/p/10744606.html

时间: 2024-11-03 18:26:46

[Swift]LeetCode1030. 距离顺序排列矩阵单元格 | Matrix Cells in Distance Order的相关文章

1030 距离顺序排列矩阵单元格 重要

get到的新知识点 vector定义二维数组 vector<vector<int>>rec(R*C,vector<int>(3))//定义一个vector变量rec,总共包含R*C个vector变量,rec由很多个vector变量组成,每一个vector大小是3,前两个存放坐标,第三个存放曼哈顿距离,相当于一个二维数组,[[0,0,1],[0,0,2]] sort条件排序 sort(begin,end,cmp) cmp是排序机制,默认是升序排列,可以自己编写cmp函数

Leetcode 1030 Matrix Cells in Distance Order (排序)

Leetcode 1030 题目描述 We are given a matrix with R rows and C columns has cells with integer coordinates (r, c), where 0 <= r < R and 0 <= c < C. Additionally, we are given a cell in that matrix with coordinates (r0, c0). Return the coordinates o

Swift - 使用TableView的静态单元格进行页面布局

通过使用静态单元格的列表,我们可以很方便的进行页面布局.下面通过一个“添加任务页面”来进行演示. 效果图如下: 实现步骤: 1,在storyboard中拖入一个TableViewController,同时创建一个对应的类(MyTabelViewController.swift)进行绑定. 2,选择表格,在属性面板中设置Content为Static Cells,Sections设置为2 3,选中第1个Sections,将Rows设置为1,并拖入一个TextFiled到单元格中 4,选中第2个Sec

Swift - 给表格添加移动单元格功能(拖动行)

1,下面的样例是给表格UITableView添加单元格移动功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,可以看到单元格后面出现拖动按钮 (3)鼠标按住拖动按钮,可以拖动单元格到任意位置 (4)拖动完毕后,还会触发TabelView对应的代理事件 2,效果图如下:   3,代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Swift - 实现点击UITableView单元格时自动展开单元格

下面是一个列表单元格cell的折叠展开效果的demo.当点击单元格时会展开该单元格,便于显示一些详情什么的.点击其他单元格原来的会关闭,同时有动画效果. 效果如如下:   代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

VBA在Excel中的应用(一):改变符合条件单元格的背景颜色

在使用excel处理数据的时候,为了能更清晰的标示出满足特定条件的单元格,对单元格添加背景色是不错的选择.手工处理的方式简单快捷,但是当遇到大批量数据,就会特别的费时费力,而且不讨好(容易出错).通过代码来处理是个不错的选择,excel可以通过VBA编程来处理内部数据,在打开excel页面后,可以通过“alt + F11”组合键来启动VBA编程界面,跟VB的编程界面和语法一样,需要注意的是如何调用excel的内容.VBA通过sheet, range和cells三个层次来调用excel中的制定区域

Excel 2003 中如何用VBA 代码访问单元格里的值及操作单元格 - 唐诗宋词的专栏 - 博客频道 - CSDN.NET

在Excel 中编写VBA 代码,最常做的事可能就是操作表单中单元格里的数据. 我这里总结一下如何从VBA 代码中操作单元格的数据. 在VBA 代码中操作单元格需要用到Range 对象,Range 是Excel 库(即Excel.exe文件)提供的一个类,封装了对表单中单元格的所有操作.Range 对象可以是一个单元格,一行单元格,一列单元格,或者四方的连续的单元格范围,甚至是几个单元格范围组合在一起.至于一个具体的Range 对象到底代表什么,就看我们怎么构造它了.(注,Range 类不支持N

Swift - 动态添加删除TableView的单元格(以及内部元件)

在Swift开发中,我们有时需要动态的添加或删除列表的单元格. 比如我们做一个消息提醒页面,默认页面只显示两个单元格.当点击第二个单元格(时间标签)时,下面会再添加一个单元格放置日期选择控件(同时新增单元格的高度也会变化).而再次点击第二个单元格,日期选择控件又会隐藏.     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Swift - 异步加载各网站的favicon图标,并在单元格中显示

下面是一个简单的应用,表格视图的各个单元格自动异步加载各个网站的favicon图标,并显示出来. 主要是复习下如何自定义单元格,单元格中图片的异步加载,以及didSet的用法. 效果图如下: 操作步骤: (1)先创建单元格类 - FaviconTableViewCell.swift 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39