# sumOfnums = sum(nums) slow = 0 L = len(nums) res = float('inf')
# if sumOfnums < target: # return 0
newSum = 0
# 循环pop for fast inrange(L): newSum += nums[fast]
while newSum >= target: res = min(res, fast - slow + 1) newSum -= nums[slow] slow += 1 # newSum在减掉nums[slow]后,不一定会再大于target,不需要再将res-1 # res -= 1 # 通过让res与inf比较,从而得知是否存在长度最小的子数组满足条件,否则就返回0; # 这样的好处是不需要对整个数组求和 if res != float('inf'): return res return0
loop, mid = n//2, n//2#迭代次数,n为奇数时,矩阵的中心点 index = 1 startx, starty = 0, 0 nums = [[0] * n for _ inrange(n)] for offset inrange(1, loop + 1): # 第一行 for i inrange(starty, n - offset): nums[startx][i] = index index += 1 # 最后一列 for j inrange(startx, n - offset): nums[j][n - offset] = index index += 1 # 最后一行 for i inrange(n - offset, starty, -1): nums[n - offset][i] = index index += 1 # 第一列 for j inrange(n - offset, startx, -1): nums[j][starty] = index index += 1 startx += 1 starty += 1 if n % 2 != 0: nums[mid][mid] = index return nums
58.区间和(第九期模拟笔试)
题目描述
给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。
输入描述
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。
import sys defmain(): data = sys.stdin.read().split() Ld = len(data) n = int(data[0])
data = list(map(int, data)) nums = list() sumOfnums = [0] * (n + 1) for i inrange(1, n + 1): num = data[i] nums.append(num) # print(nums) sumOfnums[1] = nums[0] for i inrange(1, n): sumOfnums[i + 1] = sumOfnums[i] + nums[i] # print(sumOfnums) i = n + 1 while i < Ld: # print(i, i+ 1) a, b = data[i], data[i + 1] print(sumOfnums[b - n] - sumOfnums[a - n - 1]) i += 2 if __name__ == "__main__": main()
技巧
使用 data = sys.stdin.read().split() , 一次性将所有输入读取进来
44.开发商购买土地(第五期模拟笔试)
题目描述
在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。
现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。
然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。 为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。