题目:给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序
思路:
(一)暴力法:两次循环,首先逐个求平方,其次重新排序。
(二)双指针:考虑到原数组为非递减顺序 ,则负数平方结果会影响原数组的顺序。因此两个指针分别指向数组两端(i=0,j=length-1),当 num[i]^2 > num[j]^2,则最大值应为num[i]^2,i++,j不变,反之亦然。双指针法需要借助辅助数组记录平方排序结果,当 i > j 时,数组元素已遍历结束,程序判停。
注意:辅助数组定义时要声明数组长度,否则赋值时会溢出。
Java实现
class Solution{
public int[] sortedSquares(int[] nums){
int i= 0;
int k = nums.length -1;
int j = nums.length-1;
int[] result = new int[nums.length];
while(i<=j){
if(nums[i]*nums[i] >= nums[j]*nums[j]){
result[k--] = nums[i]*nums[i];
i++;
}
else{
result[k--] = nums[j]*nums[j];
j--;
}
}
return result;
}
}
题目:给定一个含有 n
个正整数的数组和一个正整数 target
。找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
思路:
(一)暴力法:依次将每个元素作为子数组的起始位置,计算符合条件的子数组长度,比较后得出最小值。
(二)滑动窗口(双指针):子数组起始( i )和结束( j )位置均从下标0开始,比较子数组和 sum 和目标值 target 的大小关系,当 sum < target 时,j++,重新计算子数组总和然后比较;当 sum >= target 时,与子数组元素个数的原纪录比较并记录小值,sum减去当前起始位置的值,i++,重新计算子数组总和然后比较,循环往复。
注意:当 sum >= target 时,i 向前移的循环应到 sum<target 为止。另外 result 记录子数组元素个数,初始化时设置为极大值,便于比较。
Java实现
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i=0,j=0,sum=0;
int result = Integer.MAX_VALUE;
while(j<nums.length){
sum += nums[j];
while(sum>=target){
result = result>j-i+1?j-i+1:result;
sum -= nums[i];
i++;
}
j++;
}
return result == Integer.MAX_VALUE ? 0:result;
}
}
题目: 给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
提示:
1 <= n <= 20
思路:纯逻辑题,主要是观察规律。首先要搞清楚数据递加的方向,顺时针螺旋递加。其次每个方向上每层连续添加的元素个数相同,计算即可。
注意:n 为奇数时有一个单独的中心元素,因此需要特别考虑一下。
Java实现
class Solution {
public int[][] generateMatrix(int n) {
int[][] num = new int[n][n];
int i,j,k,l,count=1;
// 嵌套层数
for(k=0;k<(int)Math.ceil((double)n/2);k++){
// 每行添加元素个数
l = n-2*k -1;
if(l==0){
num[k][k] = count;
}
// 上行:从左至右
for(i=k,j=k;j<l+k;j++){
num[i][j] = count++;
}
// 右列:从上至下
for(i=k,j=l+k;i<l+k;i++){
num[i][j] = count++;
}
// 下行:从右至左
for(i=l+k,j=l+k;j>k;j--){
num[i][j] =count++;
}
// 左列:从下至上
for(i=l+k,j=k;i>k;i--){
num[i][j] = count++;
}
}
return num;
}
}