算法笔记|Day2数组基础II
☆☆☆☆☆leetcode 977.有序数组的平方
题目链接:leetcode 977.有序数组的平方
题目分析
1.采用双指针法,非递减数组平方后最大的元素一定为第一个元素或者最后一个元素的平方,依次比较即可;
2.时间复杂度为O(n),空间复杂度为O(n)。
代码
class Solution {
public int[] sortedSquares(int[] nums) {
int res[]=new int[nums.length];
int left=0,right=nums.length-1;
int n=nums.length-1;
for(left=0,right=nums.length-1;left<=right;){
if(nums[left]*nums[left]<nums[right]*nums[right]){
res[n]=nums[right]*nums[right];
n--;
right--;
}else{
res[n]=nums[left]*nums[left];
n--;
left++;
}
}
return res;
}
}
提示:int res[]=new int[nums.length];创建了一个名为 res 的新整型数组,其大小与已存在的整型数组 nums 相同
☆☆☆☆☆leetcode 209.长度最小的子数组
题目分析
1.滑动窗口法,本质和双指针类似,不断调节子序列的起始位置和终止位置;
2.时间复杂度为O(n),空间复杂度为O(1)。
代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left=0,right=0,sum=0,res=Integer.MAX_VALUE;
for(right=0;right<=nums.length-1;right++){
sum+=nums[right];
while(sum>=target){
res=res<right-left+1?res:right-left+1;//可写为res=Math.min(res,right-left+1);
sum-=nums[left];
left++;
}
}
return res==Integer.MAX_VALUE?0:res;
}
}
提示:Integer.MAX_VALUE 是 Java中一个静态常量,代表 int类型能够表示的最大值。在 Java中,int类型是一个 32位有符号整数,因此它的取值范围是从 -231到 231-1。具体地,Integer.MAX_VALUE的值是 231-1,即 2147483647。
☆leetcode 904.水果成篮(20241010更新)
题目链接:leetcode 904.水果成篮
题目分析
代码
class Solution {
public int totalFruit(int[] fruits) {
int left=0,right=0,res=0;
HashMap<Integer,Integer> hash=new HashMap<>();
while(right<fruits.length){
hash.put(fruits[right],hash.getOrDefault(fruits[right],0)+1);
while(hash.size()>2){
hash.put(fruits[left],hash.get(fruits[left])-1);
if(hash.get(fruits[left])==0){
hash.remove(fruits[left]);
}
left++;
}
res=Math.max(res,right-left+1);
right++;
}
return res;
}
}
☆leetcode 76.最小覆盖子串(待补充)
题目链接:leetcode 76.最小覆盖子串
题目分析
代码
☆☆☆☆☆leetcode 59.螺旋矩阵II
题目链接:leetcode 59.螺旋矩阵II
题目分析
1.对于大小为n×n的螺旋矩阵,需要循环n/2圈(n为奇数时,向下取整,并对中心位置的元素单独赋值),这里用loop表示循环圈数,每次循环方向如下图;
2.采用左闭右开区间,以保证每一个位置赋值不重不漏,startx表示每次循环x方向的开始位置,starty表示每次循环y方向的开始位置,offset(偏移量)辅助计算每次循环的开始或者结束位置;
3.时间复杂度 O(n2),空间复杂度 O(1)。
代码
class Solution {
public int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
int startx=0,starty=0,offset=1,count=1,loop=1;
int i,j;
while(loop<=n/2){
for(j=starty;j<n-offset;j++){
nums[startx][j]=count++;
}
for(i=startx;i<n-offset;i++){
nums[i][j]=count++;
}
for(j=n-offset;j>starty;j--){
nums[i][j]=count++;
}
for(i=n-offset;i>startx;i--){
nums[i][j]=count++;
}
startx++;
starty++;
offset++;
loop++;
}
if(n%2==1){
nums[startx][starty]=count;
}
return nums;
}
}
☆leetcode 54.螺旋矩阵(20241010更新)
题目链接:leetcode 54.螺旋矩阵
题目分析
代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m=matrix.length,n=matrix[0].length;
ArrayList<Integer> nums=new ArrayList<>();
int left=0,right=n-1,top=0,bottom=m-1;
int i,j;
while(left<=right&&top<=bottom){
for(j=left;j<=right;j++)
nums.add(matrix[top][j]);
for(i=top+1;i<=bottom;i++)
nums.add(matrix[i][right]);
if(left<right&&top<bottom){
for(j=right-1;j>left;j--)
nums.add(matrix[bottom][j]);
for(i=bottom;i>top;i--)
nums.add(matrix[i][left]);
}
left++;
right--;
top++;
bottom--;
}
return nums;
}
}