数组专题解析
有序数组的平方
思路:原数组为非递减顺序的,那么为了让平方后的结果也是非递减顺序,处理难题为负数的平方结果有可能比整数的大
该题两种实现方法:
- 暴力实现,直接原地平方,然后对数组进行排序
public int[] sortedSquares(int[] nums) {
int []res=new int[nums.length];
for(int i=nums.length-1;i>=0;i--){
res[i]=nums[i]*nums[i];
}
Arrays.sort(res);
return res;
}
其时间复杂度为O(nlog+n)=O(nlogn)
- 双指针法,一前一后进行计算
public int[] sortedSquares1(int[] nums) {
int []res=new int[nums.length];
int left=0;int right=nums.length-1;
for(int i=nums.length-1;i>=0;i--){
if(Math.abs(nums[left])>=Math.abs(nums[right])){
res[i]=(int)Math.pow(nums[left],2);
left++;
}else{
res[i]=(int)Math.pow(nums[right],2);
right--;
}
}
return res;
}
时间复杂度为O(n)
长度最短的子数组
思路:为了计算能达到和大于target的最短子数组,考虑到滑动窗口法,只有一头一尾在移动
public int minSubArrayLen1(int target, int[] nums) {
//这里不能陷入误区,不应该用
int left=0;
int maxlenth=Integer.MAX_VALUE;
int sum=0;
for(int i=0;i<nums.length;i++){
sum+=nums[i];
while(sum>=target){
maxlenth=Math.min(i-left+1,maxlenth);
sum-=nums[left++];
}
}
if(maxlenth==Integer.MAX_VALUE)
return 0;
return maxlenth;
//时间复杂度为O(n)
}
螺旋矩阵
螺旋矩阵主要是要控制好边界条件,比如说控制左闭右开,上闭右开,每次边界发生变动时,需要重新判断是否还符合要求。
class Solution {
public int[][] generateMatrix(int n) {
//左闭右开,上闭右开
int[][] matrix=new int[n][n];
int top=0,bottom=n,left=0,right=n;
int num=1;
while(left<right&&top<bottom){
for(int i=left;i<right;i++){
matrix[top][i]=num;
num++;
}
top=top+1;
if(top<bottom){
for(int i=top;i<bottom;i++){
matrix[i][right-1]=num;
num++;
}
right=right-1;
}else{
break;
}
if(left<right){
for(int i=right-1;i>=left;i--){
matrix[bottom-1][i]=num;
num++;
}
bottom--;
}else{
break;
}
if(top<bottom){
for(int i=bottom-1;i>=top;i--){
matrix[i][left]=num;
num++;
}
left++;
}else{
break;
}
}
return matrix;
}
}