算法训练第二天
209. 长度最小的子数组
思路:
这道题原本想用后缀和。但是超时了。只能用双指针模拟一个滑动窗口并用一个变量sum去记录窗口内的和。
代码:
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:min_len = 0x3f3f3f3fsum = 0i = 0for j in range(0, len(nums)):sum += nums[j]while sum >= target:cur_len = j - i + 1min_len = min(min_len, cur_len)sum -= nums[i]i += 1return min_len if min_len != 0x3f3f3f3f else 0
59. 螺旋矩阵 II
思路:
很简单的一道模拟类的题目,只需要想清楚填充的区间即可。
代码:
class Solution(object):def generateMatrix(self, n):""":type n: int:rtype: List[List[int]]"""arr = [[0 for h in range(0,n)] for i in range(0,n)]i = 0j = 0this_num = 1while this_num <=n*n:while j<n and arr[i][j]==0:arr[i][j] = this_numj+=1this_num+=1j-=1i+=1while i<n and arr[i][j]==0:arr[i][j] = this_numi += 1this_num += 1i-=1j-=1while j>=0 and arr[i][j]==0:arr[i][j] = this_numj -= 1this_num += 1j+=1i-=1while i>=0 and arr[i][j]==0:arr[i][j] = this_numi -= 1this_num += 1i+=1j+=1return arr
58. 区间和
思路:
经典的前缀和算法应用。
代码:
import sysdef main():num = int(int(sys.stdin.readline()))arr = [int(int(sys.stdin.readline())) for i in range(num)]arr1 = arr.copy()for i in range(1,num):arr1[i] += arr1[i-1]for line in sys.stdin:a, b = map(int, line.strip().split())print(arr1[b]-arr1[a]+arr[a])if __name__ == '__main__':main()