977有序数组平方
非递减顺序 排序的整数数组 每个数字的平方 组成的新数组
题目分析:负数正数组成的非递减数组 两边平方最大,中间平方最小
我的题解:找到正负数交界,从中间向外 比较赋值 代码非常繁冗
class Solution {
public int[] sortedSquares(int[] nums) {
int flag=-1;
int[] news= new int[nums.length];
for (int i = 0; i < nums.length; i++) {
if (nums[i]<0){
flag=i;
}else {
break;
}
}
flag++;
int small = flag-1,big = flag,count = 0;
while (small>=0 && big < nums.length){
int smallval = nums[small]*nums[small];
int bigval = nums[big]*nums[big];
if (smallval<=bigval){
news[count] = smallval;
small--;
}else {
news[count] = bigval;
big++;
}
count++;
}
if (small>=0){
while (small>=0){
news[count] = nums[small]*nums[small];
count++;
small--;
}
}else if (big < nums.length){
while (big<nums.length){
news[count] = nums[big]*nums[big];
count++;
big++;
}
}
return news;
}
}
看了其他题解:从两边向中间对比 指针相遇则结束
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0 , right = nums.length-1;
int[] result = new int[nums.length];
int flag = nums.length-1;
while (left<=right){
int leftval = nums[left]*nums[left];
int rightval = nums[right]*nums[right];
if (leftval <= rightval){
result[flag] = rightval;
right--;
}else {
result[flag] = leftval;
left++;
}
flag--;
}
return result;
}
}
209长度最小子数组
其和 ≥ s 的长度最小的连续子数组
滑动窗口法
右指针向右移动直至 和满足,后左指针向右移动直至 和不满足 ,循环进行,从而滑动窗口
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0, right = 0, value = 0, length = nums.length, flag = 0;
while (right< nums.length){
while (value < target&&right<nums.length){
value+=nums[right];
right++;
}
if (value >= target){
flag = 1;
if (left == right){
return 1;
}
while (value >= target&&left<nums.length){
if (right-left<length&&value >= target){
length = right-left;
}
value-=nums[left];
left++;
}
}
}
if (flag==1){
return length;
}else {
return 0;
}
}
}
59螺旋矩阵
元素按顺时针顺序螺旋排列
模拟螺旋填充过程 分为4步 设置填充层数 注意填充边界判断
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int count = 1, val = 0;
int i=0,j=0,flag=1;
while (val<n*n-1){
while (j<n-count){
val++;
matrix[i][j]=val;
j++;
}
while (i<n-count){
val++;
matrix[i][j]=val;
i++;
}
while (j>count-1){
val++;
matrix[i][j]=val;
j--;
}
while (i>count-1) {
val++;
matrix[i][j] = val;
i--;
}
i++;
j++;
count++;
}
if (n%2==1){
matrix[i][j] = val+1;
}
return matrix;
}
}
收获
中间小两边大的数据 可以从两边处理 不必找中间值
滑动窗口 在求连续和 重复子字符串 等连续子问题 有重要应用