mirror of
https://github.com/chefyuan/algorithm-base.git
synced 2024-12-27 04:46:17 +00:00
为数组篇 增加 Swift 实现
This commit is contained in:
parent
2c4afffbd3
commit
c14c2297f1
@ -114,5 +114,45 @@ class Solution:
|
|||||||
ans = max(ans, t)
|
ans = max(ans, t)
|
||||||
return ans
|
return ans
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func maxSatisfied(_ customers: [Int], _ grumpy: [Int], _ minutes: Int) -> Int {
|
||||||
|
let len = customers.count
|
||||||
|
var winSum = 0, rightSum = 0, leftSum = 0
|
||||||
|
// 右区间的值
|
||||||
|
for i in minutes..<len {
|
||||||
|
if grumpy[i] == 0 {
|
||||||
|
rightSum += customers[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 窗口的值
|
||||||
|
for i in 0..<minutes {
|
||||||
|
winSum += customers[i]
|
||||||
|
}
|
||||||
|
var maxCustomer = winSum + leftSum + rightSum
|
||||||
|
// 窗口左边缘
|
||||||
|
var left = 1, right = minutes
|
||||||
|
while right < len {
|
||||||
|
// 重新计算左区间的值,也可以用 customer 值和 grumpy 值相乘获得
|
||||||
|
if grumpy[left - 1] == 0 {
|
||||||
|
leftSum += customers[left - 1]
|
||||||
|
}
|
||||||
|
// 重新计算右区间值
|
||||||
|
if grumpy[right] == 0 {
|
||||||
|
rightSum -= customers[right]
|
||||||
|
}
|
||||||
|
// 窗口值
|
||||||
|
winSum = winSum - customers[left - 1] + customers[right]
|
||||||
|
maxCustomer = max(maxCustomer, winSum + leftSum + rightSum) // 保留最大值
|
||||||
|
// 移动窗口
|
||||||
|
left += 1
|
||||||
|
right += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return maxCustomer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -111,3 +111,152 @@ class Solution:
|
|||||||
return maxwin
|
return maxwin
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
Swift:数组模拟,超时(58 / 61 个通过测试用例)
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func longestSubarray(_ nums: [Int], _ limit: Int) -> Int {
|
||||||
|
var maxQueue:[Int] = []
|
||||||
|
var minQueue:[Int] = []
|
||||||
|
let len = nums.count
|
||||||
|
var right = 0, left = 0, maxWin = 0
|
||||||
|
while right < len {
|
||||||
|
while !maxQueue.isEmpty && (maxQueue.last! < nums[right]) {
|
||||||
|
maxQueue.removeLast()
|
||||||
|
}
|
||||||
|
while !minQueue.isEmpty && (minQueue.last! > nums[right]) {
|
||||||
|
minQueue.removeLast()
|
||||||
|
}
|
||||||
|
maxQueue.append(nums[right])
|
||||||
|
minQueue.append(nums[right])
|
||||||
|
while (maxQueue.first! - minQueue.first!) > limit {
|
||||||
|
if maxQueue.first! == nums[left] {
|
||||||
|
maxQueue.removeFirst()
|
||||||
|
}
|
||||||
|
if minQueue.first! == nums[left] {
|
||||||
|
minQueue.removeFirst()
|
||||||
|
}
|
||||||
|
left += 1
|
||||||
|
}
|
||||||
|
maxWin = max(maxWin, right - left + 1)
|
||||||
|
right += 1
|
||||||
|
}
|
||||||
|
return maxWin
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Swift:使用双端队列(击败了100.00%)
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func longestSubarray(_ nums: [Int], _ limit: Int) -> Int {
|
||||||
|
var maxQueue = Deque<Int>.init()
|
||||||
|
var minQueue = Deque<Int>.init()
|
||||||
|
let len = nums.count
|
||||||
|
var right = 0, left = 0, maxWin = 0
|
||||||
|
while right < len {
|
||||||
|
while !maxQueue.isEmpty && (maxQueue.peekBack()! < nums[right]) {
|
||||||
|
maxQueue.dequeueBack()
|
||||||
|
}
|
||||||
|
while !minQueue.isEmpty && (minQueue.peekBack()! > nums[right]) {
|
||||||
|
minQueue.dequeueBack()
|
||||||
|
}
|
||||||
|
maxQueue.enqueue(nums[right])
|
||||||
|
minQueue.enqueue(nums[right])
|
||||||
|
while (maxQueue.peekFront()! - minQueue.peekFront()!) > limit {
|
||||||
|
if maxQueue.peekFront()! == nums[left] {
|
||||||
|
maxQueue.dequeue()
|
||||||
|
}
|
||||||
|
if minQueue.peekFront()! == nums[left] {
|
||||||
|
minQueue.dequeue()
|
||||||
|
}
|
||||||
|
left += 1
|
||||||
|
}
|
||||||
|
maxWin = max(maxWin, right - left + 1)
|
||||||
|
right += 1
|
||||||
|
}
|
||||||
|
return maxWin
|
||||||
|
}
|
||||||
|
|
||||||
|
// 双端队列数据结构
|
||||||
|
public struct Deque<T> {
|
||||||
|
private var array: [T?]
|
||||||
|
private var head: Int
|
||||||
|
private var capacity: Int
|
||||||
|
private let originalCapacity: Int
|
||||||
|
|
||||||
|
public init(_ capacity: Int = 10) {
|
||||||
|
self.capacity = max(capacity, 1)
|
||||||
|
originalCapacity = self.capacity
|
||||||
|
array = [T?](repeating: nil, count: capacity)
|
||||||
|
head = capacity
|
||||||
|
}
|
||||||
|
|
||||||
|
public var isEmpty: Bool {
|
||||||
|
return count == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
public var count: Int {
|
||||||
|
return array.count - head
|
||||||
|
}
|
||||||
|
|
||||||
|
public mutating func enqueue(_ element: T) {
|
||||||
|
array.append(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
public mutating func enqueueFront(_ element: T) {
|
||||||
|
if head == 0 {
|
||||||
|
capacity *= 2
|
||||||
|
let emptySpace = [T?](repeating: nil, count: capacity)
|
||||||
|
array.insert(contentsOf: emptySpace, at: 0)
|
||||||
|
head = capacity
|
||||||
|
}
|
||||||
|
|
||||||
|
head -= 1
|
||||||
|
array[head] = element
|
||||||
|
}
|
||||||
|
|
||||||
|
public mutating func dequeue() -> T? {
|
||||||
|
guard head < array.count, let element = array[head] else { return nil }
|
||||||
|
|
||||||
|
array[head] = nil
|
||||||
|
head += 1
|
||||||
|
|
||||||
|
if capacity >= originalCapacity && head >= capacity*2 {
|
||||||
|
let amountToRemove = capacity + capacity/2
|
||||||
|
array.removeFirst(amountToRemove)
|
||||||
|
head -= amountToRemove
|
||||||
|
capacity /= 2
|
||||||
|
}
|
||||||
|
return element
|
||||||
|
}
|
||||||
|
|
||||||
|
public mutating func dequeueBack() -> T? {
|
||||||
|
if isEmpty {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
return array.removeLast()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func peekFront() -> T? {
|
||||||
|
if isEmpty {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
return array[head]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func peekBack() -> T? {
|
||||||
|
if isEmpty {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
return array.last!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -76,6 +76,32 @@ class Solution:
|
|||||||
return rearr
|
return rearr
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
|
||||||
|
let count = nums.count
|
||||||
|
if count < 2 {
|
||||||
|
return [0]
|
||||||
|
}
|
||||||
|
|
||||||
|
var rearr: [Int] = []
|
||||||
|
// 查询元素
|
||||||
|
for i in 0..<count {
|
||||||
|
for j in i+1..<count {
|
||||||
|
// 发现符合条件情况
|
||||||
|
if nums[i] + nums[j] == target {
|
||||||
|
rearr.append(i)
|
||||||
|
rearr.append(j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rearr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
**哈希表**
|
**哈希表**
|
||||||
|
|
||||||
**解析**
|
**解析**
|
||||||
@ -159,3 +185,20 @@ class Solution:
|
|||||||
return [0]
|
return [0]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
|
||||||
|
var m:[Int:Int] = [:]
|
||||||
|
for i in 0..<nums.count {
|
||||||
|
let n = nums[i]
|
||||||
|
if let k = m[target - n] { // 如果存在则返回
|
||||||
|
return [k, i]
|
||||||
|
}
|
||||||
|
m[n] = i // 不存在则存入
|
||||||
|
}
|
||||||
|
return [0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -78,6 +78,32 @@ class Solution:
|
|||||||
return False
|
return False
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func containsNearbyDuplicate(_ nums: [Int], _ k: Int) -> Bool {
|
||||||
|
if nums.count == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
var dict:[Int:Int] = [:]
|
||||||
|
for i in 0..<nums.count {
|
||||||
|
// 如果含有
|
||||||
|
if let v = dict[nums[i]] {
|
||||||
|
// 判断是否小于K,如果小于等于则直接返回
|
||||||
|
let abs = abs(i - v)
|
||||||
|
if abs <= k {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 更新索引,此时有两种情况,不存在,或者存在时,将后出现的索引保存
|
||||||
|
dict[nums[i]] = i
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
**HashSet**
|
**HashSet**
|
||||||
|
|
||||||
**解析**
|
**解析**
|
||||||
@ -140,3 +166,28 @@ class Solution:
|
|||||||
s.remove(nums[i - k])
|
s.remove(nums[i - k])
|
||||||
return False
|
return False
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func containsNearbyDuplicate(_ nums: [Int], _ k: Int) -> Bool {
|
||||||
|
if nums.count == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
var set:Set<Int> = []
|
||||||
|
for i in 0..<nums.count {
|
||||||
|
// 含有该元素,返回true
|
||||||
|
if set.contains(nums[i]) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// 添加新元素
|
||||||
|
set.insert(nums[i])
|
||||||
|
if set.count > k {
|
||||||
|
set.remove(nums[i - k])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -164,3 +164,23 @@ public:
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func removeElement(_ nums: inout [Int], _ val: Int) -> Int {
|
||||||
|
if nums.count == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var i = 0
|
||||||
|
for j in 0..<nums.count {
|
||||||
|
if nums[j] != val {
|
||||||
|
nums[i] = nums[j]
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -89,6 +89,33 @@ class Solution:
|
|||||||
return len(res)
|
return len(res)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func firstMissingPositive(_ nums: [Int]) -> Int {
|
||||||
|
if nums.count == 0 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
// 因为是返回第一个正整数,不包括 0,所以需要长度加1,细节1
|
||||||
|
var res:[Int] = Array.init(repeating: 0, count: nums.count + 1)
|
||||||
|
// 将数组元素添加到辅助数组中
|
||||||
|
for x in nums {
|
||||||
|
if x > 0 && x < res.count {
|
||||||
|
res[x] = x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 遍历查找,发现不一样时直接返回
|
||||||
|
for i in 1..<res.count {
|
||||||
|
if res[i] != i {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 缺少最后一个,例如 1,2,3此时缺少 4 ,细节2
|
||||||
|
return res.count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
我们通过上面的例子了解这个解题思想,我们有没有办法不使用辅助数组完成呢?我们可以使用原地置换,直接在 nums 数组内,将值换到对应的索引处,与上个方法思路一致,只不过没有使用辅助数组,理解起来也稍微难理解一些。
|
我们通过上面的例子了解这个解题思想,我们有没有办法不使用辅助数组完成呢?我们可以使用原地置换,直接在 nums 数组内,将值换到对应的索引处,与上个方法思路一致,只不过没有使用辅助数组,理解起来也稍微难理解一些。
|
||||||
|
|
||||||
@ -166,3 +193,42 @@ class Solution:
|
|||||||
return n + 1
|
return n + 1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func firstMissingPositive(_ nums: [Int]) -> Int {
|
||||||
|
var nums = nums
|
||||||
|
let len = nums.count
|
||||||
|
if len == 0 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
// 遍历数组
|
||||||
|
for i in 0..<len {
|
||||||
|
// 需要考虑指针移动情况,大于0,小于len+1,不等与i+1,
|
||||||
|
// 两个交换的数相等时,防止死循环
|
||||||
|
while nums[i] > 0
|
||||||
|
&& nums[i] < len + 1
|
||||||
|
&& nums[i] != i + 1
|
||||||
|
&& nums[i] != nums[nums[i] - 1]
|
||||||
|
{
|
||||||
|
//nums.swapAt(i, (nums[i] - 1)) // 系统方法
|
||||||
|
self.swap(&nums, i, (nums[i] - 1)) // 自定义方法
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 遍历寻找缺失的正整数
|
||||||
|
for i in 0..<len {
|
||||||
|
if nums[i] != i + 1 {
|
||||||
|
return i + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len + 1
|
||||||
|
}
|
||||||
|
func swap(_ nums: inout [Int], _ i: Int, _ j: Int) {
|
||||||
|
let temp = nums[i]
|
||||||
|
nums[i] = nums[j]
|
||||||
|
nums[j] = temp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -84,6 +84,32 @@ class Solution:
|
|||||||
return max(maxcount, right - left)
|
return max(maxcount, right - left)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func findMaxConsecutiveOnes(_ nums: [Int]) -> Int {
|
||||||
|
|
||||||
|
var left = 0, right = 0, res = 0
|
||||||
|
let len = nums.count
|
||||||
|
while right < len {
|
||||||
|
if nums[right] == 1 {
|
||||||
|
right += 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 保存最大值
|
||||||
|
res = max(res, right - left)
|
||||||
|
// 跳过 0 的情况
|
||||||
|
while right < len && nums[right] == 0 {
|
||||||
|
right += 1
|
||||||
|
}
|
||||||
|
// 同一起点继续遍历
|
||||||
|
left = right
|
||||||
|
}
|
||||||
|
return max(res, right - left)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
刚才的效率虽然相对高一些,但是代码不够优美,欢迎各位改进,下面我们说一下另外一种情况,一个特别容易理解的方法。
|
刚才的效率虽然相对高一些,但是代码不够优美,欢迎各位改进,下面我们说一下另外一种情况,一个特别容易理解的方法。
|
||||||
|
|
||||||
@ -132,3 +158,22 @@ class Solution:
|
|||||||
return ans
|
return ans
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func findMaxConsecutiveOnes(_ nums: [Int]) -> Int {
|
||||||
|
let len = nums.count
|
||||||
|
var maxCount = 0, count = 0
|
||||||
|
for i in 0..<len {
|
||||||
|
if nums[i] == 1 {
|
||||||
|
count += 1
|
||||||
|
} else { // 这里可以改成 while
|
||||||
|
maxCount = max(maxCount, count)
|
||||||
|
count = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max(maxCount, count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -120,5 +120,40 @@ class Solution:
|
|||||||
return arr
|
return arr
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func spiralOrder(_ matrix: [[Int]]) -> [Int] {
|
||||||
|
var arr:[Int] = []
|
||||||
|
var left = 0, right = matrix[0].count - 1
|
||||||
|
var top = 0, down = matrix.count - 1
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
for i in left...right {
|
||||||
|
arr.append(matrix[top][i])
|
||||||
|
}
|
||||||
|
top += 1
|
||||||
|
if top > down { break }
|
||||||
|
for i in top...down {
|
||||||
|
arr.append(matrix[i][right])
|
||||||
|
}
|
||||||
|
right -= 1
|
||||||
|
if left > right { break}
|
||||||
|
for i in stride(from: right, through: left, by: -1) {
|
||||||
|
arr.append(matrix[down][i])
|
||||||
|
}
|
||||||
|
down -= 1
|
||||||
|
if top > down { break}
|
||||||
|
for i in stride(from: down, through: top, by: -1) {
|
||||||
|
arr.append(matrix[i][left])
|
||||||
|
}
|
||||||
|
left += 1
|
||||||
|
if left > right { break}
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -45,6 +45,8 @@ class Solution {
|
|||||||
|
|
||||||
Python3版本的代码会超时
|
Python3版本的代码会超时
|
||||||
|
|
||||||
|
Swift版本的代码会超时
|
||||||
|
|
||||||
下面我们我们使用前缀和的方法来解决这个题目,那么我们先来了解一下前缀和是什么东西。其实这个思想我们很早就接触过了。见下图
|
下面我们我们使用前缀和的方法来解决这个题目,那么我们先来了解一下前缀和是什么东西。其实这个思想我们很早就接触过了。见下图
|
||||||
|
|
||||||
![](https://cdn.jsdelivr.net/gh/tan45du/github.io.phonto2@master/myphoto/微信截图_20210113193831.4wk2b9zc8vm0.png)
|
![](https://cdn.jsdelivr.net/gh/tan45du/github.io.phonto2@master/myphoto/微信截图_20210113193831.4wk2b9zc8vm0.png)
|
||||||
@ -160,3 +162,27 @@ class Solution {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func subarraySum(_ nums: [Int], _ k: Int) -> Int {
|
||||||
|
if nums.count == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var map: [Int: Int] = [:]
|
||||||
|
map[0] = 1 // 需要添加入一个元素垫底,已支持前几位就满足的情况
|
||||||
|
var presum = 0, count = 0
|
||||||
|
|
||||||
|
for x in nums {
|
||||||
|
presum += x
|
||||||
|
//当前前缀和已知,判断是否含有 presum - k的前缀和,那么我们就知道某一区间的和为 k 了。
|
||||||
|
if let v = map[presum - k] {
|
||||||
|
count += v //获取presum-k前缀和出现次数
|
||||||
|
}
|
||||||
|
map[presum] = (map[presum] ?? 0) + 1
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -140,6 +140,43 @@ class Solution:
|
|||||||
return arr
|
return arr
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func spiralOrder(_ matrix: [[Int]]) -> [Int] {
|
||||||
|
var arr:[Int] = []
|
||||||
|
var left = 0, right = matrix[0].count - 1
|
||||||
|
var top = 0, down = matrix.count - 1
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
for i in left...right {
|
||||||
|
arr.append(matrix[top][i])
|
||||||
|
}
|
||||||
|
top += 1
|
||||||
|
if top > down { break }
|
||||||
|
for i in top...down {
|
||||||
|
arr.append(matrix[i][right])
|
||||||
|
}
|
||||||
|
right -= 1
|
||||||
|
if left > right { break}
|
||||||
|
for i in stride(from: right, through: left, by: -1) {
|
||||||
|
arr.append(matrix[down][i])
|
||||||
|
}
|
||||||
|
down -= 1
|
||||||
|
if top > down { break}
|
||||||
|
for i in stride(from: down, through: top, by: -1) {
|
||||||
|
arr.append(matrix[i][left])
|
||||||
|
}
|
||||||
|
left += 1
|
||||||
|
if left > right { break}
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
我们仅仅是将 54 反过来了,往螺旋矩阵里面插值,下面我们直接看代码吧,大家可以也可以对其改进,大家可以思考一下,如果修改能够让代码更简洁!
|
我们仅仅是将 54 反过来了,往螺旋矩阵里面插值,下面我们直接看代码吧,大家可以也可以对其改进,大家可以思考一下,如果修改能够让代码更简洁!
|
||||||
|
|
||||||
Java Code:
|
Java Code:
|
||||||
@ -226,3 +263,45 @@ class Solution:
|
|||||||
return arr.tolist()
|
return arr.tolist()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func generateMatrix(_ n: Int) -> [[Int]] {
|
||||||
|
var arr:[[Int]] = Array.init(repeating: Array.init(repeating: 0, count: n), count: n)
|
||||||
|
var left = 0, right = n - 1
|
||||||
|
var top = 0, bottom = n - 1
|
||||||
|
var num = 1, numSize = n * n
|
||||||
|
|
||||||
|
while true {
|
||||||
|
for i in left...right {
|
||||||
|
arr[top][i] = num
|
||||||
|
num += 1
|
||||||
|
}
|
||||||
|
top += 1
|
||||||
|
if num > numSize { break}
|
||||||
|
for i in top...bottom {
|
||||||
|
arr[i][right] = num
|
||||||
|
num += 1
|
||||||
|
}
|
||||||
|
right -= 1
|
||||||
|
if num > numSize { break}
|
||||||
|
for i in stride(from: right, through: left, by: -1) {
|
||||||
|
arr[bottom][i] = num
|
||||||
|
num += 1
|
||||||
|
}
|
||||||
|
bottom -= 1
|
||||||
|
if num > numSize { break}
|
||||||
|
for i in stride(from: bottom, through: top, by: -1) {
|
||||||
|
arr[i][left] = num
|
||||||
|
num += 1
|
||||||
|
}
|
||||||
|
left += 1
|
||||||
|
if num > numSize { break}
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -85,3 +85,23 @@ class Solution:
|
|||||||
arr[0] = 1
|
arr[0] = 1
|
||||||
return arr
|
return arr
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func plusOne(_ digits: [Int]) -> [Int] {
|
||||||
|
let count = digits.count
|
||||||
|
var digits = digits
|
||||||
|
for i in stride(from: count - 1, through: 0, by: -1) {
|
||||||
|
digits[i] = (digits[i] + 1) % 10
|
||||||
|
if digits[i] != 0 {
|
||||||
|
return digits
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var arr: [Int] = Array.init(repeating: 0, count: count + 1)
|
||||||
|
arr[0] = 1
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -96,6 +96,38 @@ class Solution:
|
|||||||
nums[j] = temp
|
nums[j] = temp
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func sortColors(_ nums: inout [Int]) {
|
||||||
|
|
||||||
|
let count = nums.count
|
||||||
|
var left = 0, i = left, right = count - 1
|
||||||
|
while i <= right {
|
||||||
|
if nums[i] == 2 {
|
||||||
|
//nums.swapAt(i, right) 直接调用系统方法
|
||||||
|
self.swap(&nums, i, right) // 保持风格统一走自定义交换
|
||||||
|
right -= 1
|
||||||
|
} else if nums[i] == 0 {
|
||||||
|
//nums.swapAt(i, left) 直接调用系统方法
|
||||||
|
self.swap(&nums, i, left) // 保持风格统一走自定义交换
|
||||||
|
i += 1
|
||||||
|
left += 1
|
||||||
|
} else {
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func swap(_ nums: inout [Int], _ i: Int, _ j: Int) {
|
||||||
|
let temp = nums[i]
|
||||||
|
nums[i] = nums[j]
|
||||||
|
nums[j] = temp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
另外我们看这段代码,有什么问题呢?那就是我们即使完全符合时,仍会交换元素,这样会大大降低我们的效率。
|
另外我们看这段代码,有什么问题呢?那就是我们即使完全符合时,仍会交换元素,这样会大大降低我们的效率。
|
||||||
|
|
||||||
例如:[0,0,0,1,1,1,2,2,2]
|
例如:[0,0,0,1,1,1,2,2,2]
|
||||||
@ -174,4 +206,39 @@ class Solution:
|
|||||||
temp = nums[i]
|
temp = nums[i]
|
||||||
nums[i] = nums[j]
|
nums[i] = nums[j]
|
||||||
nums[j] = temp
|
nums[j] = temp
|
||||||
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func sortColors(_ nums: inout [Int]) {
|
||||||
|
|
||||||
|
let count = nums.count
|
||||||
|
var left = 0, i = left, right = count - 1
|
||||||
|
while i <= right {
|
||||||
|
if nums[i] == 0 {
|
||||||
|
//nums.swapAt(i, left) 直接调用系统方法
|
||||||
|
self.swap(&nums, i, left) // 保持风格统一走自定义交换
|
||||||
|
left += 1
|
||||||
|
}
|
||||||
|
if nums[i] == 2 {
|
||||||
|
//nums.swapAt(i, right) 直接调用系统方法
|
||||||
|
self.swap(&nums, i, right) // 保持风格统一走自定义交换
|
||||||
|
right -= 1
|
||||||
|
//如果不等于 1 则需要继续判断,所以不移动 i 指针,i--
|
||||||
|
if nums[i] != 1 {
|
||||||
|
i -= 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func swap(_ nums: inout [Int], _ i: Int, _ j: Int) {
|
||||||
|
let temp = nums[i]
|
||||||
|
nums[i] = nums[j]
|
||||||
|
nums[j] = temp
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
@ -61,6 +61,24 @@ class Solution:
|
|||||||
return -1
|
return -1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func findRepeatNumber(_ nums: [Int]) -> Int {
|
||||||
|
var set: Set<Int> = []
|
||||||
|
for n in nums {
|
||||||
|
if set.contains(n) { // 如果发现某元素存在,则返回
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
set.insert(n) // 存入集合
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
#### **原地置换**
|
#### **原地置换**
|
||||||
|
|
||||||
**解析**
|
**解析**
|
||||||
@ -136,3 +154,26 @@ class Solution:
|
|||||||
nums[temp] = temp
|
nums[temp] = temp
|
||||||
return -1
|
return -1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func findRepeatNumber(_ nums: [Int]) -> Int {
|
||||||
|
if nums.isEmpty {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
var nums = nums;
|
||||||
|
for i in 0..<nums.count {
|
||||||
|
while nums[i] != i {
|
||||||
|
if nums[i] == nums[nums[i]] {
|
||||||
|
return nums[i]
|
||||||
|
}
|
||||||
|
nums.swapAt(i, nums[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -106,3 +106,22 @@ class Solution:
|
|||||||
return windowlen
|
return windowlen
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift Code
|
||||||
|
|
||||||
|
```swift
|
||||||
|
class Solution {
|
||||||
|
func minSubArrayLen(_ target: Int, _ nums: [Int]) -> Int {
|
||||||
|
|
||||||
|
var sum = 0, windowlen = Int.max, i = 0
|
||||||
|
for j in 0..<nums.count {
|
||||||
|
sum += nums[j]
|
||||||
|
while sum >= target {
|
||||||
|
windowlen = min(windowlen, j - i + 1)
|
||||||
|
sum -= nums[i]
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return windowlen == Int.max ? 0 : windowlen
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user