977 有序数组的平方(简单)
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序.
解法一:暴力解法
把数组内的每个内容都直接平方,然后再进行排序Arrays.sort(nums)
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length-1;
for(int i = 0;i <nums.length;i++){
nums[i] = nums[i] * nums[i];
}
Arrays.sort(nums);
return nums;
}
}
解法二:双指针 思路: 1.创建双指针,分别指向旧数组的开头和末尾,然后创建一个长度与旧数组相等的新数组,并创建新指针index指向新数组末尾 2.开始循环while(left<=right),判断旧数组的双指针所指向内容平方后的大小,把平方后大的内容添加到新数组的末尾,然后index--
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length -1;
int[] res = new int[nums.length];
int index = nums.length-1;
while (left <= right){
if(nums[left]*nums[left] > nums[right]*nums[right]){
res[index--] = nums[left]*nums[left];
left++;
}
else {
res[index--] = nums[right]*nums[right];
right--;
}
}
return res;
}
}
note: 1.创建新数组的同时要新建一个指针并指向新数组的末尾 2.while内要用小于等于,否则会丢掉元素 3.只需要用一个if和else,不需要单独判断nums[left]和nums[right]相等情况,因为旧数组本身就是排序好的数组,当不满足if(nums[left]*nums[left] > nums[right]*nums[right])时,直接把right指向的内容存到index,并且right--就好了
209. 长度最小的子数组(中等)
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0
解法一:暴力解法(超时) 两层for循环,外层i循环,内层j循环;内层循环定义sum负责求和,当sum大于target,求出当前子数组长度(两个指针相减+1)j-i+1;并赋值给res,并在res处进行Math.min判断,因为满足大于target时的子数组可能不唯一,需要取得长度最短的子数组;最后先判断res是否等于最初值,然后返回res。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res = Integer.MAX_VALUE;
for(int i = 0; i < nums.length;i++){
int sum = 0;
for(int j = i ; j<nums.length;j++){
sum += nums[j];
if(sum>=target){
res = Math.min(res,j-i+1);//需要进行min判断,否则会一最后一次大于目标值时的长度res为准
break;
}
}
}
return res==Integer.MAX_VALUE? 0:res;//需要对res是否等于初值进行判断,否则若没有找到大于target的数会返回Max_Value
}
}
解法二:滑动窗口 思路:定义left、right两个指针,外层for循环right向前遍历,每遍历一次都需要用sum求和,直到sum > target,计算子数组长度,并向前移动left指针,并计算该滑动窗口的值。其余部分与暴力解法相同
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res = Integer.MAX_VALUE;
int left = 0;
int right = 0;
int sum = 0;
for(; right< nums.length;right++){
sum += nums[right];
while(sum >= target){
res = Math.min(res,right-left+1);
sum -= nums[left++];
}
}
return res==Integer.MAX_VALUE? 0:res;
}
}
59. 螺旋矩阵 II(中等)
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
思路:
1.填充顺序如上图所示,在填充时采取左闭右开原则,保持每个循环的条件相同
2.需要判断n是奇数偶数,如果是奇数则需要单独填充最中心的内容
3.需要有loop记录圈数,start代表新的一层循环开始时起始点所在位置
4.i,j分别记录横纵坐标
class Solution {
public int[][] generateMatrix(int n) {
int loop = 1;//循环次数
int count =1;//填充计数
int start = 0;//每填充完一圈,start会加一,即下次循环会向内走一层
int i,j;
int[][] nums = new int[n][n];
while(loop <= n/2){//要有while判断需要几次循环
for (j = start ; j < n -loop ; j++){
nums[start][j]=count++;
}
for(i = start ; i < n - loop ; i++){
nums[i][j] = count++;
}
for(; j >= loop ; j--){//左闭右开因此取到等号
nums[i][j] = count++;
}
for( ; i >= loop ; i--){
nums[i][j] = count++;
}
loop++;
start++;
}
if(n % 2 == 1){
nums[start][start] = n*n;
}
return nums;
}
}