Day1+2: Array
Q977 Squares of a Sorted Array
双指针但倒序插入
'''
examples: [-4,-1,0,3,10]
output: [0,1,9,16,100]
'''
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
ans = [-1]*n
start, end , k = 0, n-1, n-1 #一个从左到右,一个从右到左,ans倒序开始插入
while start <= end:
if nums[end]*nums[end] >= nums[start]*nums[start]:
ans[k] = nums[end]*nums[end]
end -= 1
else:
ans[k] = nums[start]*nums[start]
start += 1
k -= 1
return ans
var sortedSquares = function(nums) {
let n = nums.length;
let start=0,end=n-1,k=n-1;
let ans = new Array(n).fill(0); // in Python, [-1]*n
while (start<=end){
if (nums[start]*nums[start]<nums[end]*nums[end]){
ans[k--]=nums[end]*nums[end];
end--;
}
else {
ans[k--]=nums[start]*nums[start];
start++;
}
}
return ans;
};
Q209 Minimum Size Subarray Sum
滑动窗口保持start_idx不变
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
Sum, res = 0, float("inf")
i = 0
for j in range(len(nums)):
Sum += nums[j]
while Sum >= target:
res = min(res, j-i+1)
Sum -= nums[i]
i += 1 # 移动start_idx的时刻
return 0 if res == float("inf") else res
var minSubArrayLen = function(target, nums) {
let start, end
start = end = 0
let sum = 0
let ans = Infinity // in Python, res = float("inf")
while(end < nums.length){
sum += nums[end];
while (sum >= target) {
ans = Math.min(ans, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans === Infinity ? 0 : ans // (condition)?(result:result)
};
Q59 Spiral Matrix
左闭右开loop
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0] * n for _ in range(n)]
count = 1
loop, mid = n//2, n//2
startx, starty = 0, 0
for offset in range(1, loop+1):
# [left, right)
for i in range(starty, n-offset):
nums[startx][i] = count
count += 1
# [top, bottom)
for i in range(startx, n-offset):
nums[i][n-offset] = count
count += 1
# [right, left)
for i in range(n-offset, starty, -1):
nums[n-offset][i] = count
count += 1
# [bottom, top)
for i in range(n-offset, startx, -1):
nums[i][starty] = count
count += 1
startx += 1
starty += 1
if n%2 != 0:
nums[mid][mid] = count
return nums
var generateMatrix = function(n) {
let startX = startY = 0; // 起始位置
let loop = Math.floor(n/2); // 旋转圈数
let mid = Math.floor(n/2); // 中间位置
let offset = 1; // 控制每一层填充元素个数, 这里是每一层的元素个数,python的offset是值index偏移
let count = 1; // 更新填充数字
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
while (loop--) {
let row = startX, col = startY;
// 上行从左到右(左闭右开)
for (; col < startY + n - offset; col++) {
res[row][col] = count++;
}
// 右列从上到下(左闭右开)
for (; row < startX + n - offset; row++) {
res[row][col] = count++;
}
// 下行从右到左(左闭右开)
for (; col > startY; col--) {
res[row][col] = count++;
}
// 左列做下到上(左闭右开)
for (; row > startX; row--) {
res[row][col] = count++;
}
// 更新起始位置
startX++;
startY++;
// 更新offset, 所以这里是连减2
offset += 2;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2 === 1) {
res[mid][mid] = count;
}
return res;
};
Reference from: https://programmercarl.com/