// 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
非递减顺序的数组平方后两边的数值是最大的,可以用这个特点用两个指针一前一后不断比较大小,较大的从result尾部倒着输入。
public int[] sortedSquares(int[] nums) {
int[] result=new int[nums.length];
int index=nums.length-1;
for(int left=0,right=nums.length-1;left<=right;index--){
if (nums[left]*nums[left]>nums[right]*nums[right]){
result[index]=nums[left]*nums[left];
left++;
}
else {
result[index]=nums[right]*nums[right];
right--;
}
}
return result;
}
// 给定一个含有 n 个正整数的数组和一个正整数 target 。
// 找出该数组中满足其总和大于等于 target 的长度最小的子数组
// [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0
首先肯定需要遍历整个数组从头到尾相加找到和大于target的子数组,通过前后两个指针可以将子数组进行不断地伸缩。
在一个for循环中j指针不断后移使得子数组相加大于target,满足后记录目前最短的子数组长length,就可以挪动前指针i,缩短子数组长看是否满足相加大于target,最后不断循环返回最短子数组长result。
public int minSubArrayLen(int target, int[] nums) {
int left=0,right=0,result=Integer.MAX_VALUE,sum=0,length=0;
for(right=0;right<nums.length;right++){
sum+=nums[right];
while(sum>=target){
length=right-left+1;
result=result<length?result:length;
sum-=nums[left++];
}
}
return result==Integer.MAX_VALUE?0:result;
}
//给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
可以观察出按照顺时针螺旋顺序的规律,先向右遍历后向下再左最后上,循环终止条件即为left和right相等并且top和bottom相等。
二维数组的一个框为数轴的y轴,第二框为数轴的x轴。
public int[][] generateMatrix(int n) {
int[][] result=new int[n][n];
int value=1,left=0,right=n-1,top=n-1,bottom=0;
while(left<=right&&bottom<=top) {
for (int x = left, y = bottom; x <=right; x++) {
result[y][x] = value++;
}
bottom++;
for (int x=right,y=bottom;y<=top;y++){
result[y][x]=value++;
}
right--;
for (int x=right,y=top;x>=left;x--){
result[y][x] = value++;
}
top--;
for (int x=left,y=top;y>=bottom;y--){
result[y][x] = value++;
}
left++;
}
return result;
}