Leetcode209.长度最小的子数组
题目链接:209.长度最小的子数组
注意:子数组的概念、滑动窗口方法中循环标志 j 的意义为终止位置
C++:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = nums.size()+1;
int sum = 0;
int i = 0;
for(int j=0; j < nums.size(); j++)
{
sum += nums[j];
while(sum >= target)
{
result = min(result, j-i+1);
sum -= nums[i++];
}
}
if(result < nums.size()+1)
return result;
else
return 0;
}
};
Python:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
i, result, summary = 0, len(nums)+1, 0
for j in range(len(nums)):
summary += nums[j]
while summary >= target:
result = min(result, j-i+1)
summary -= nums[i]
i += 1
if result < len(nums)+1:
return result
else:
return 0
Leetcode59.螺旋矩阵II
题目链接:59.螺旋矩阵II
注意:最多转 n/2 圈的原因是,每转一圈上下左右都会减一,也就是说上下减2、左右减2,那么最多转 n/2 圈。
C++:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int xstart = 0;
int ystart = 0;
int lim = 1;
int count = 1;
vector<vector<int>> result(n, vector<int>(n, 0));
int m = n;
while(n/2)
{
for(int j = ystart; j < m-lim; j++)
{
result[xstart][j] = count++;
}
for(int i = xstart; i < m-lim; i++)
{
result[i][m-lim] = count++;
}
for(int j = m-lim; j > ystart; j--)
{
result[m-lim][j] = count++;
}
for(int i = m-lim; i > xstart; i--)
{
result[i][ystart] = count++;
}
lim++;
n--;
xstart++;
ystart++;
}
if(m%2)
result[m/2][m/2] = count;
return result;
}
};
Python:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
result = [[0] * n for _ in range(n)]
xstart, ystart = 0, 0
mid, loop = n // 2, n//2
count = 1
for offset in range(1, loop + 1):
for j in range(ystart, n-offset):
result[xstart][j] = count
count += 1
for i in range(xstart, n-offset):
result[i][j+1] = count
count += 1
for j in range(n-offset, ystart, -1):
result[i+1][j] = count
count += 1
for i in range(n-offset, xstart, -1):
result[i][j-1] = count
count += 1
xstart += 1
ystart += 1
if n%2 != 0:
result[mid][mid] = count
return result
卡玛网.开发商购买土地
题目链接:卡玛网:开发商购买土地
注意:前缀和の计算 前缀和计算讲解
C++:(前缀和版)
#include <iostream>
#include <climits>
#include <vector>
using namespace std;
//应用前缀和
int main(void)
{
int n, m;
cin >> n >> m;
vector<vector<int>>vec(n, vector<int>(m, 0));
//输入二维数组内容,计算总和
int sum = 0;
for(int i=0; i < n; i++)
{
for(int j=0; j < m; j++)
{
cin >> vec[i][j];
sum += vec[i][j];
}
}
//计算横向前缀和
vector<int> horizontal(n, 0);
for(int i = 0; i < n; i++)
{
for(int j=0; j < m; j++)
{
horizontal[i] += vec[i][j];
}
}
//计算纵向前缀和
vector<int> vertical(m, 0);
for(int j=0; j < m; j++)
{
for(int i = 0; i < n; i++)
{
vertical[j] += vec[i][j];
}
}
//划分区域计算差值
int result = INT_MAX;
//横向区域
int h_sum = 0;
for(int i=0; i < n; i++)
{
h_sum += horizontal[i];
result = min(result, abs(sum - h_sum - h_sum));
}
//纵向区域
int v_sum = 0;
for(int j=0; j < m; j++)
{
v_sum += vertical[j];
result = min(result, abs(sum - v_sum - v_sum));
}
//输出
cout << result << endl;
}
Python:(暴力优化版)
import sys
def main():
input = sys.stdin.read
data = input().split()
# 输入n, m
idx = 0
n = int(data[idx])
idx += 1
m = int(data[idx])
idx += 1
# 输入数组
vec = []
sum = 0
for i in range(n):
row = []
for j in range(m):
num = int(data[idx])
idx += 1
row.append(num)
sum += num
vec.append(row)
result = float('inf')
# 横向计算
horizontal = 0
for i in range(n):
for j in range(m):
horizontal += vec[i][j]
result = min(result, abs(sum - 2 * horizontal))
# 纵向计算
vertical = 0
for j in range(m):
for i in range(n):
vertical += vec[i][j]
result = min(result, abs(sum - 2 * vertical))
print(result)
if __name__ == "__main__":
main()