977.有序数组的平方
题目链接:有序数组的平方
思路:1、暴力法;2、双指针法
1.暴力法
class Solution {
public int[] sortedSquares(int[] nums) {
for(int a = 0;a<=nums.length-1;a++){
nums[a] = nums[a]*nums[a];
}
//冒泡排序算法
for(int i = 0;i<nums.length-1;i++){
for(int j = 0;j<nums.length-i-1;j++){
if(nums[j]>nums[j+1]){
int t = nums[j];
nums[j] = nums[j+1];
nums[j+1] = t;
}
}
}
return nums;
}
}
2.双指针法
按非递减顺序排序的整数数组,定义双指针从数组左右两边开始比较大小。
指针指向较大值处,该值传入新定义的数组result,result长度为nums.length,指针向右或左移动一位。
新定义的数组从最右侧开始传值,指针向左移动。
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length-1;
int[] result = new int[nums.length];
int k = result.length-1;
while(left<=right){
if(nums[left]*nums[left]<nums[right]*nums[right]){
result[k--] = nums[right]*nums[right];
--right;
}else{
result[k--] = nums[left]*nums[left];
++left;
}
}
return result;
}
}
209.长度最小的子数组
题目链接:长度最小的子数组
思路:1、滑动窗口;2、暴力法
1.滑动窗口
通过一个for循环对窗口的终止位置进行循环,采用while循环判断窗口值之和是否≥s。若成立,窗口进行移动。末位置通过for循环变动,起始位置通过i++来移动。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE;
int sum = 0;
int i = 0;
int Length = 0;
for(int j = 0;j<=nums.length-1;j++){
sum += nums[j];
while(sum >= target){
Length = (j-i+1);
result = result < Length ? result : Length;
sum -= nums[i++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
2.暴力法
通过两个for循环,一个for循环循环数组初始位置,一个for循环循环数组末位置,从而实现区间的搜索。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE;
int sum = 0;
int Length = 0;
for(int i = 0;i<=nums.length-1;i++){
sum = 0;
for(int j = i;j<=nums.length-1;j++){
sum += nums[j];
if (sum >= target) {
Length = j - i + 1;
result = result < Length ? result : Length;
break;
}
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
59.螺旋矩阵Ⅱ
题目链接:螺旋矩阵Ⅱ
思路:模拟法
坚持一个规则处理每一条边。定义新数组arr,给数组赋值count,每条边遍历长度l,i和j。
四个for循环模拟转动一圈,区间为左闭右开。
class Solution {
public int[][] generateMatrix(int n) {
int[][] arr = new int[n][n];
int count = 1;
int i;
int j;
for(int l = 0; l<n/2+1; l++){
i = l;
//左到右
for(j = l; j<n-l; j++){
arr[i][j] = count++;
}
j--;
//上到下
for(i = i+1;i<n-l; i++){
arr[i][j] = count++;
}
i--;
//右到左
for(j = j-1; j>=l; j--){
arr[i][j] = count++;
}
j++;
//下到上
for(i = i-1; i>l; i--){
arr[i][j] = count++;
}
}
return arr;
}
}