977.有序数组的平方
题目:
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int n=nums.length;
int[] newNum=new int[n];
for(int i=0;i<n;i++){
newNum[i]=nums[i]*nums[i];
}
Arrays.sort(newNum);
return newNum;
}
}
一次通过。
题目:
第一次的代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
Arrays.sort(nums);
int n=nums.length;
int x=0;
int mutex=0;
for (int i=n-1;i>=0;i--){
if (x<target){
mutex++;
x=x+nums[i];
}
else return mutex;
}
return 0;
}
}
有用例没过。
原因:没有考虑全加刚好等于target的情况,且用排序的方法,题目要求的是连续子数组,这样做打乱顺序了,是错误的,于是考虑别的方法。
1.暴力求解法
即固定开始的数,并逐个相加,直到满足条件。
代码如下:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int min=Integer.MAX_VALUE;
for (int i=0;i<nums.length;i++){
int sum=nums[i];
if (sum>=target)
return 1;
for (int j=i+1;j<nums.length;j++){
sum=sum+nums[j];
if (sum>=target){
min=Math.min(min,j-i+1);
break;
}
}
}
return min==Integer.MAX_VALUE?0:min;
}
}
其中Integer.MAX_VALUE的含义是整数类型的最大值。
暴力求解法效率较低,容易超时。
2.滑动窗口
即:将元素不停入队,直到大于target为止,再进行出队,直到小于target,再进行入队。代码中使用双指针实现。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int lo=0;
int hi=0;
int min=Integer.MAX_VALUE;
int sum=0;
while (hi<nums.length){
sum+=nums[hi++];
while (sum>=target){
min=Math.min(min,hi-lo);
sum-=nums[lo++];
}
}
return min==Integer.MAX_VALUE?0:min;
}
}
59.螺旋矩阵II
题目:
画图演示,每条边的规律要一样(都左闭右开)
class Solution {
public int[][] generateMatrix(int n) {
int start=0;
int offset=0;
int count=1;
int i,j;
int[][] numbers=new int[n][n];
while (offset++<n/2){
for (j=start;j<n-offset;j++)
numbers[start][j]=count++;
for (i=start;i<n-offset;i++)
numbers[i][j]=count++;
for (;j>=offset;j--)
numbers[i][j]=count++;
for (;i>=offset;i--)
numbers[i][j]=count++;
start++;
}
if (n%2==1)
numbers[start][start]=count;
return numbers;
}
}