1.普通做法
package day2;
import java.util.Arrays;
public class 有序数组的平方0 {
public static void main(String[] args) {
int[] nums = {-4,-1,0,3,10};
sortedSquares(nums);
System.out.println(Arrays.toString(nums));
}
public static int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i] *= nums[i];
}
for (int i = 0; i < nums.length - 1; i++) {
for (int i1 = i + 1; i1 < nums.length; i1++) {
if (nums[i] > nums[i1]){
int temp = nums[i1];
nums[i1] = nums[i];
nums[i] = temp;
}
}
}
return nums;
}
}
2.双指针
package day2;
import java.util.Arrays;
public class 有序数组的平方1双指针 {
public static void main(String[] args) {
int[] nums = {-4, -1, 0, 3, 10};
//1.数组的特点为升序,平方最大值不是最左就是最右
int[] result = sortedSquares(nums);
System.out.println(Arrays.toString(result));
}
public static int[] sortedSquares(int[] nums) {
int[] newNums = new int[nums.length];
int i = nums.length - 1;
//2.定义两个指针指向原数组两头
int left = 0;
int right = nums.length - 1;
while (left <= right) {//4.注意=,最后两个指针指向同一个元素,要把他放到新数组中
//3.比较两头的平方,谁大就把他放到新数组的末尾,然后移动该指针
if (nums[left] * nums[left] > nums[right] * nums[right]) {
newNums[i--] = nums[left] * nums[left];
left++;
} else {
newNums[i--] = nums[right] * nums[right];
right--;
}
}
return newNums;
}
}
二.209.长度最小的子数组https://leetcode.cn/problems/minimum-size-subarray-sum/
1.暴力遍历
package day2;
public class 长度最小的子数组0 {
public static void main(String[] args) {
int[] nums = {2,3,1,2,4,3};
int target = 7;
int result = minSubArrayLen(target, nums);
System.out.println(result);
}
public static int minSubArrayLen(int target, int[] nums) {
int minLength = Integer.MAX_VALUE;;
//遍历所有的子数组
for (int i = 0; i < nums.length; i++) {
int sum = 0;
for (int i1 = i; i1 < nums.length; i1++) {
sum += nums[i1];
if (sum >= target){
int len = i1 - i + 1;
minLength = minLength < len ? minLength : len;
}
}
}
return minLength == Integer.MAX_VALUE ? 0 : minLength;
}
}
2.滑动窗口
package day2;
public class 长度最小的子数组1滑动窗口 {
public static void main(String[] args) {
int[] nums = {2, 3, 1, 2, 4, 3};
int target = 7;
int result = minSubArrayLen(target, nums);
System.out.println(result);
}
public static int minSubArrayLen(int target, int[] nums) {
int minLength = Integer.MAX_VALUE;
//将其初始化为整数类型的最大值 Integer.MAX_VALUE。
// 这样做是为了在后续的比较中找到最小的长度值。
int sum = 0;
int i = 0;//定义左边界
for (int j = 0; j < nums.length; j++) {
sum += nums[j];
//该循环用来移动左边界从而缩小长度
while (sum >= target) {
int len = j - i + 1;
minLength = Math.min(minLength, len);//minLength < len ? minLength : len;
sum -= nums[i++];//减掉左边界的值,判断是否还满足条件
}
}
return minLength == Integer.MAX_VALUE ? 0 : minLength;//若没赋值就返回0
}
}
三.59.螺旋矩阵IIhttps://leetcode.cn/problems/spiral-matrix-ii/
1.左闭右闭
package day2;
import java.util.Arrays;
public class 螺旋矩阵II1左闭右闭 {
public static int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int num = 1;
while (num <= n * n) {
for (int i = left; i <= right; i++) {
matrix[top][i] = num++;
}
top++;
for (int i = top; i <= bottom; i++) {
matrix[i][right] = num++;
}
right--;
for (int i = right; i >= left; i--) {
matrix[bottom][i] = num++;
}
bottom--;
for (int i = bottom; i >= top; i--) {
matrix[i][left] = num++;
}
left++;
}
return matrix;
}
public static void main(String[] args) {
int n = 3;
int[][] nums = generateMatrix(n);
for (int[] num : nums) {
System.out.println(Arrays.toString(num));
}
}
}
2.左闭右开
package day2;
import java.util.Arrays;
public class 螺旋矩阵II1左闭右开 {
public static int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int num = 1;
while (num < n * n) { //注意不取等
for (int i = left; i < right; i++) {
matrix[top][i] = num++;
}
for (int i = top; i < bottom; i++) {
matrix[i][right] = num++;
}
for (int i = right; i > left; i--) {
matrix[bottom][i] = num++;
}
for (int i = bottom; i > top; i--) {
matrix[i][left] = num++;
}
//相当于是一圈一圈放置数字
top++;
right--;
bottom--;
left++;
}
//若n为奇数,number增加为n时,要跳出循环,把number放置到中间
if (n % 2 == 1) {
int mid = (n-1)/2;
matrix[mid][mid] = num;
}
return matrix;
}
public static void main(String[] args) {
int n = 4;
int[][] nums = generateMatrix(n);
for (int[] num : nums) {
System.out.println(Arrays.toString(num));
}
}
}