977.有序数组的平方
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解法1:对数组元素进行平方,再快速排序
时间复杂度:O() 空间复杂度:O()
C:
int cmp(const void* _a, const void* _b) {
int a = *(int*)_a, b = *(int*)_b;
return a - b;
}
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
(*returnSize) = numsSize;
int* ans = malloc(sizeof(int) * numsSize);
for (int i = 0; i < numsSize; ++i) {
ans[i] = nums[i] * nums[i];
}
qsort(ans, numsSize, sizeof(int), cmp);
return ans;
}
java:
class Solution {
public int[] sortedSquares(int[] nums) {
int[] ans=new int[nums.length];
for(int i=0;i<nums.length;i++) ans[i]=nums[i]*nums[i];
Arrays.sort(ans);
return ans;
}
}
解法2:已知数组有序,使用两个指针分别指向位置0和n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。
C:
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
int* ans=malloc(sizeof(int)*numsSize);
*returnSize=numsSize;
int i=0,j=numsSize-1,pos=numsSize-1;
while(i<=j){
if(nums[j]*nums[j]>=nums[i]*nums[i]){
ans[pos]=nums[j]*nums[j];
j--;
}
else{
ans[pos]=nums[i]*nums[i];
i++;
}
pos--;
}
return ans;
}
java:
class Solution {
public int[] sortedSquares(int[] nums) {
int[] ans = new int[nums.length];
int i=0,j=nums.length-1,pos=nums.length-1;
while(i<=j){
if(nums[j]*nums[j]>=nums[i]*nums[i]){
ans[pos]=nums[j]*nums[j];
j--;
}
else{
ans[pos]=nums[i]*nums[i];
i++;
}
pos--;
}
return ans;
}
}
209.长度最小的子数组
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解法:滑动窗口
int minSubArrayLen(int target, int* nums, int numsSize) {
int i=0,j=0,min=INT_MAX,sum=0;
while(j<numsSize){
sum+=nums[j];
while(sum>=target){
min=fmin(min,j-i+1);
sum-=nums[i++];
}
j++;
}
return min==INT_MAX?0:min;
}
java:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int min = Integer.MAX_VALUE;
int i = 0, j = 0, sum = 0;
while (j < nums.length) {
sum += nums[j];
while (sum >= target) {
min = Math.min(min, j - i + 1);
sum -= nums[i++];
}
j++;
}
return min == Integer.MAX_VALUE ? 0 : min;
}
}
59.螺旋矩阵II
题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解法:顺时针按层求解,注意划定边界
C:
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
int num = 1;
int** matrix = malloc(sizeof(int*) * n);
*returnSize = n;
*returnColumnSizes = malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
matrix[i] = malloc(sizeof(int) * n);
memset(matrix[i], 0, sizeof(int) * n);
(*returnColumnSizes)[i] = n;
}
int left = 0, right = n - 1, top = 0, bottom = n - 1;
while (left <= right && top <= bottom) {
for (int column = left; column <= right; column++) {
matrix[top][column] = num;
num++;
}
for (int row = top + 1; row <= bottom; row++) {
matrix[row][right] = num;
num++;
}
if (left < right && top < bottom) {
for (int column = right - 1; column > left; column--) {
matrix[bottom][column] = num;
num++;
}
for (int row = bottom; row > top; row--) {
matrix[row][left] = num;
num++;
}
}
left++;
right--;
top++;
bottom--;
}
return matrix;
}
java:
class Solution {
public int[][] generateMatrix(int n) {
int num = 1;
int[][] matrix = new int[n][n];
int left = 0, right = n - 1, top = 0, bottom = n - 1;
while (left <= right && top <= bottom) {
for (int column = left; column <= right; column++) {
matrix[top][column] = num;
num++;
}
for (int row = top + 1; row <= bottom; row++) {
matrix[row][right] = num;
num++;
}
if (left < right && top < bottom) {
for (int column = right - 1; column > left; column--) {
matrix[bottom][column] = num;
num++;
}
for (int row = bottom; row > top; row--) {
matrix[row][left] = num;
num++;
}
}
left++;
right--;
top++;
bottom--;
}
return matrix;
}
}