数组
以下为 LeetCode 数组 相关问题解法记录。
849. 到最近的人的最大距离
问题分析:分别求出距离左边和距离右边的最大距离,取最小值中的最大值。
代码:
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 |
|
启发:左右开工。
状态:优于33%的提交。
189. 旋转数组
问题分析:nums[i] = nums[i - k]。
代码:
1 2 3 4 5 6 7 8 9 |
|
启发:不是最优解法。
66. 加一
问题分析:高精度加1,先加1,再处理进位。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
启发:array.insert(value, at:index),(0..100).reversed()。
状态:优于55%的提交。
674. 最长连续递增序列
问题分析:模拟。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
启发:注意边界情况。
状态:优于100%的提交。
747. 至少是其他数字两倍的最大数
问题分析:模拟。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
888. 公平的糖果交换
问题分析:给定一个数,找另一个数。
方法一:模拟,双重循环,sumA + (B[j] - A[i]) == sumB + (A[i] - B[j]),时间复杂度O(n2)。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
方法二:哈希,B[j] = (sumB + 2 * A[i] - sumA) / 2,时间复杂度O(n),空间复杂度O(n)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
方法三:排序 + 二分查找,不申请额外空间。
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 |
|
启发:给定一个数,查找另一个数。
830. 较大分组的位置
问题分析:模拟,注意考虑边界情况。
代码:
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 |
|
启发:注意边界条件。
状态:优于25%的提交。
904. 水果成篮
问题分析:最长连续子序列长度,且子序列不同个数最多为2。
代码:
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 |
|
启发:不是最佳解法。
905. 按奇偶校验排序数组
问题分析:模拟。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
35. 搜索插入位置
问题分析:二分查找。
方法一:顺序查找,时间复杂度O(N)。
代码:
1 2 3 4 5 6 7 8 9 10 |
|
方法二:二分查找,时间复杂度O(logN)。
代码:
1 2 3 4 5 6 7 |
|
swift class Solution { func findShortestSubArray(_ nums: [Int]) -> Int { var hash: [Int:Int] = [:] var maxCount = 0 for i in nums { if hash[i] == nil { hash[i] = 1 } else { hash[i]! = hash[i]! + 1 } if maxCount < hash[i]! { maxCount = hash[i]! } } if maxCount == 1 { return 1 } var dus:[Int] = [] for (key, value) in hash{ if value == maxCount { dus.append(key) } } var minLength = 50000 for maxValue in dus { var left = 0 var right = nums.count - 1 for (index, value) in nums.enumerated() { if value == maxValue { left = index break } } for (index, value) in nums.enumerated().reversed() { if value == maxValue { right = index break } } if minLength > right - left + 1 { minLength = right - left + 1 } } return minLength
}
}
1 2 3 4 5 |
|
swift class Solution { func twoSum(_ numbers: [Int], _ target: Int) -> [Int] { var i = 0, j = numbers.count - 1 while i < j { let value = numbers[i] + numbers[j] if value > target { j -= 1 } else if value < target { i += 1 } else { return [i + 1, j + 1] } } return [] } }
1 2 3 4 5 6 |
|
class Solution { func maxProfit(_ prices: [Int]) -> Int { var maxProfit = 0 for i in 0..<prices.count { for j in (i+1)..<prices.count { let profit = prices[j] - prices[i] if maxProfit < profit { maxProfit = profit } } } return maxProfit } }
1 2 3 |
|
class Solution {
let transform = [[-1, -1], [0, -1], [1, -1],
[-1, 0], [0, 0], [1, 0],
[-1, 1], [0, 1], [1, 1]]
func imageSmoother(_ M: [[Int]]) -> [[Int]] {
var N: [[Int]] = []
let row = M.count
let colum = M[0].count
for i in 0..<row {
var array: [Int] = []
for j in 0..<colum {
var value = 0
var count = 0
for k in 0..<9 {
let xx = i + transform[k][0]
let yy = j + transform[k][1]
if xx >= 0 && xx < row && yy >= 0 && yy < colum {
value = value + M[xx][yy]
count = count + 1
}
}
array.append(Int(value / count))
}
N.append(array)
}
return N
}
}
1 2 3 4 5 6 |
|
class Solution { func transpose(_ A: [[Int]]) -> [[Int]] { var AT: [[Int]] = [] for i in 0..<A[0].count { var row: [Int] = [] for j in 0..<A.count { row.append(A[j][i]) } AT.append(row) } return AT } }
1 2 3 |
|
class Solution {
func generate(_ numRows: Int) -> [[Int]] {
var rows: [[Int]] = []
for i in 0..
1 2 3 4 5 |
|
class Solution { func getRow(_ rowIndex: Int) -> [Int] { if rowIndex == 0 { return [1] } var nums: [Int] = [] for i in 0…rowIndex { nums.append(0) } nums[0] = 1 for i in 1…rowIndex { for j in stride(from: i, to: 0, by: -1) { nums[j] = nums[j] + nums[j - 1] } } return nums } }
1 2 3 4 5 6 |
|
class Solution { func matrixReshape(_ nums: [[Int]], _ r: Int, _ c: Int) -> [[Int]] { let row: Int = nums.count if row == 0 { return nums } let colum: Int = nums[0].count if colum == 0 { return nums } // 不可以转换 if row * colum != r * c { return nums } // 转换 var index: Int = 0; var reshapeNums: [[Int]] = [] for _ in 0..<r { var rowArray: [Int] = [] for _ in 0..<c { rowArray.append(nums[index / colum][index % colum]) index = index + 1 } reshapeNums.append(rowArray) } return reshapeNums } }
1 2 3 4 5 |
|
class Solution { func isToeplitzMatrix(_ matrix: [[Int]]) -> Bool { // 初始化 var testRow = matrix[0] if matrix.count == 1 { return true } // 依次检测每行 for i in 1..<matrix.count { testRow.remove(at:testRow.count - 1) testRow.insert(matrix[i][0], at:0) for j in 0..<matrix[i].count { if testRow[j] != matrix[i][j] { return false } } } return true } }
1 2 3 4 5 6 7 |
|
class Solution { func majorityElement(_ nums: [Int]) -> Int { // 排序 let sortedNums = nums.sorted{$0 < $1} // 取中位数 return sortedNums[nums.count / 2] } }
1 2 3 |
|
class Solution { func moveZeroes(_ nums: inout [Int]) { for i in 0..<nums.count { if nums[i] == 0 { var index = i for j in (i+1)..<nums.count { if nums[j] != 0 { index = j break } } if index != i { var temp = nums[i] nums[i] = nums[index] nums[index] = temp } } } } }
1 2 3 |
|
class Solution { func findMaxConsecutiveOnes(_ nums: [Int]) -> Int { var maxCount = 0 var currentCount = 0 for i in nums { if i == 0 { currentCount = 0 } else { currentCount += 1 } if maxCount < currentCount { maxCount = currentCount } } return maxCount } }
1 2 3 |
|
class Solution { func isMonotonic(_ A: [Int]) -> Bool { var isIncrease = true var isDecrease = true for i in 1..<A.count { if A[i-1] > A[i] { isIncrease = false break } } for i in 1..<A.count { if A[i-1] < A[i] { isDecrease = false break } } return isIncrease || isDecrease
}
} ```