day02 977
leetcode.977有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
因为是对平方之后的数进行排序,负数的平方可能更大,而平方之后最大的负数在最左边,平方之后最大的正数在最右边,存入新数组应该从这两的最大值开始存,此时用双指针法,最左最右各一个指针对数组进行遍历:新建一个新数组result(长度和原数组大小相等),左指针与右指针进行遍历,平方更大的数放入新数组result中。
class Solution {
public int[] sortedSquares(int[] nums) {
int fast=0,slow=nums.length-1;
int k=nums.length-1;
int[] result=new int[nums.length];
while(fast<=slow){ //注意是 ’<=‘而不是’<‘ 否则会漏掉一个元素
if(nums[fast]*nums[fast]<nums[slow]*nums[slow]){
result[k--]=nums[slow]*nums[slow]; //右边更大,右边平方存入result,右指针向左移动一位
//新数组 result因为每次存的是最大数,所以从尾部开始更新
slow--;
}else{
result[k--]=nums[fast]*nums[fast];
fast++;
}
}
return result;
}
}
209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
暴力解法
class Solution { //暴力解法
public int minSubArrayLen(int target, int[] nums) {
int result=Integer.MAX_VALUE;
for(int i=0;i<nums.length;i++){ //两个for循环 外层for循环确定左边界 内for循环 从外循i起点开始遍历 确定右边界
int sum=0;
for(int j=i;j<nums.length;j++){
sum+=nums[j];
if(sum>=target){
result=Math.min(result,j-i+1);
break;
}
}
}
return result==Integer.MAX_VALUE?0:result;
}
}
利用两个指针left,right使用滑动窗口方法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left=0,right=0;
int result=Integer.MAX_VALUE; //定义一个result变量存储当前数组长度
int sum=0;
for(right=0;right<nums.length;right++){ //快指针先向后遍历,当sum和大于等于target时停止,然后开始操作慢指针向后遍历,只要满足sum>=target,寻找出最小的子序列。
sum+=nums[right];
while(sum>=target){
result=Math.min(result,right-left+1);
sum-=nums[left];
left++;
}
}
return result==Integer.MAX_VALUE?0:result; //有不满足条件的情况 则输出0
}
}
- 螺旋矩阵 II
class Solution {
public int[][] generateMatrix(int n) {
int l=0; //左边界
int r=n-1; //右边界
int t=0; //上边界
int b=n-1; //下边界
int k=1;
int[][] result=new int[n][n];
while(k<=n*n){
for(int i=l;i<=r;i++,k++){ //元素从左边界开始 横坐标改变 纵坐标不变 所以是i=l i++
result[t][i]=k;
}
t++; //上边界 填满了一层 所以加一
for(int i=t;i<=b;i++,k++){ //上边界开始 下边界结束
result[i][r]=k;
}
r--;
for(int i=r;i>=l;i--,k++){
result[b][i]=k;
}
b--;
for(int i=b;i>=t;i--,k++){
result[i][l]=k;
}
l++;
}
return result;
}
}
posted on 2022-09-22 20:57 你是千堆雪我是长街7 阅读(4) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理