209.长度最小的子数组
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
//时间复杂度:O(n^2)
//空间复杂度:O(1)
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX; // 最终的结果
int sum = 0; // 子序列的数值之和
int subLength = 0; // 子序列的长度
for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
sum = 0;
for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
sum += nums[j];
if (sum >= s) { // 一旦发现子序列和超过了s,更新result
subLength = j - i + 1; // 取子序列的长度
result = result < subLength ? result : subLength;
break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
}
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};
方法二:滑动窗口
//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len = nums.length, total = 0, count = Integer.MAX_VALUE;
int left = 0, right = 0;
//滑动窗口
for (right = 0; right < len; right++) {
total += nums[right];
while (total >= target) {
count = Math.min(count, right - left + 1);
total -= nums[left];
left++;
}
}
return count == Integer.MAX_VALUE ? 0 : count;
}
}
59.螺旋矩阵II
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
第一想法:之前做过类似的题,关键要捋清楚根据顺时针方向填入一行或一列元素后,后面要填入的空间边界的变化。
思路:
以四个方向填入元素步骤为一次循环,要循环n/2次。在上边界填入元素时,需要知道左边界,和右边界;在右边界填入数据时,需要知道上和下边界。其他方向填入元素可由图看出。
因此,我们定义四个变量分别来代表四个边界,当某个边界填完元素后,该边界会发生变化。
如果是上边界添加完了。上边界会+1,相反,如果是下边界添加完了,下边界会-1。左右边界同理得出
//时间复杂度O(n^2)
//空间复杂度O(1)
class Solution {
public int[][] generateMatrix(int n) {
int left = 0, right = n - 1, upper = 0, under = n - 1;
int num = 1;
int[][] matrix = new int[n][n];
while (upper <= under) {
//上,往右
for (int i = left; i <= right; i++) {
matrix[upper][i] = num++;
}
upper++;
//右,往下
for (int i=upper;i<=under;i++){
matrix[i][right]=num++;
}
right--;
//下,往左
for (int i=right;i>=left;i--){
matrix[under][i]=num++;
}
under--;
//左,往上
for (int i=under;i>=upper;i--){
matrix[i][left]=num++;
}
left++;
}
return matrix;
}
}
区间和
文章讲解:58. 区间和 | 代码随想录
题目讲解:58. 区间和(第九期模拟笔试)
思路:求一个数组下标start到下标end之间的所有元素之和,如果所求区间很多,并且区间很长,则性能很差,会导致超时。采用区间和解法,再往数组添加元素的同时,用一个数组来存储求和的值,num[i]的值表示为0到i区间所有元素的和。由此可得,当求start到end区间的元素和时,直接由num[end]-num[start-1]可得出。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] array = new int[n];
for (int i = 0; i < n; i++) {
int number = input.nextInt();
if (i==0){
array[i]=number;
continue;
}
array[i]=array[i-1]+number;
}
while (input.hasNextInt()){
int start = input.nextInt();
int end = input.nextInt();
if (start==0){
System.out.println(array[end]);
continue;
}
System.out.println(array[end]-array[start-1]);
}
}
}
开发商购买土地
题目链接:44. 开发商购买土地(第五期模拟笔试)
文章讲解:44. 开发商购买土地 | 代码随想录
思路:在输入元素的过程中计算出每行和每列的元素和,并用数组存储起来,然后分别循环两个数组,经比较可得出最小差。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
int total = 0, result = Integer.MAX_VALUE;
int[] row = new int[n];
int[] col = new int[m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int number = input.nextInt();
row[i] += number;
col[j] += number;
total += number;
}
}
//横向分
int rowTotal = 0;
for (int i = 0; i < n-1; i++) {
rowTotal += row[i];
result = Math.min(result, Math.abs(total - 2 * rowTotal));
}
//纵向
int colTotal=0;
for (int i = 0; i < m-1; i++) {
colTotal += col[i];
result = Math.min(result, Math.abs(total - 2 * colTotal));
}
System.out.println(result);
}
}
767

被折叠的 条评论
为什么被折叠?



