977.有序数组的平方
思路:
只能想到暴力解法。。。
平方后最大的数值一定来自于数组的两边,所以进行比较之后存到一个新的数组就好了。
然后控制指针的移动!
class Solution {
public int[] sortedSquares(int[] nums) {
for(int i = 0; i < nums.length; i++){
nums[i] = nums[i] * nums[i];
}
quickSort(nums,0,nums.length-1);
return nums;
}
public void quickSort(int[] nums, int l, int r){
if(l >= r){
return;
}
int left = l, right = r;
int pivot = nums[left];
while(left < right){
while(left < right && nums[right] >= pivot){
right--;
}
if(left < right) {
nums[left] = nums [right];
}
while(left < right && nums[left] <= pivot){
left ++;
}
if(left < right){
nums[right] = nums[left];
}
if(left >= right){
nums[left] = pivot;
}
}
quickSort(nums,l,right-1);
quickSort(nums,right+1,r);
}
}
可以使用双指针来提高效率。
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
int left = 0;
int right = nums.length-1;
int write = nums.length-1;
while(left <= right){
if(nums[left] * nums[left] > nums[right] * nums[right]){
res[write] = nums[left] * nums[left];
left++;
write--;
}
else{
res[write] = nums[right] * nums[right];
right--;
write--;
}
}
return res;
}
}
209.长度最小的子数组
思路:
使用滑动窗口
class Solution {
public int minSubArrayLen(int target, int[] nums) {
if(target == 0){
return 0;
}
int left = 0;
int right = 0;
int sum = 0;
int min = Integer.MAX_VALUE;
while(right < nums.length){
sum += nums[right];
right++;
while(sum >= target){
min = Math.min(min,right - left);
sum -= nums[left];
left++;
}
}
return min == Integer.MAX_VALUE ? 0 : min;
}
}
59.螺旋矩阵II
思路:
无,看了k神的解析,明天再做一遍。我发现我自己对二维数组有点不熟练。。
class Solution {
public int[][] generateMatrix(int n) {
int l = 0, r = n - 1, t = 0, b = n - 1;
int[][] res = new int[n][n];
int num = 1, max = n * n;
while(num <= max){
for(int i = l; i <= r; i++) {
res[t][i] = num++;
}
t++;
for(int i = t; i <= b ; i++){
res[i][r] = num++;
}
r--;
for(int i = r; i >= l ; i--){
res[b][i] = num++;
}
b--;
for(int i = b; i>= t; i--){
res[i][l] = num++;
}
l++;
}
return res;
}
}