有序数组的平方:
暴力解法:平方后重新排序,时间复杂度O(n*logn)
双指针解法(建立在有序数组的基础之上):
1.新数组的下标由大到小更新,这样保证新数组由小到大排列
2.i<=j的原因:当i,j指针同时指向一个元素(i=j)时,也将其更新在新的数组内
3.用if else语句,nums[i]=nums[j]的情况既可以把result[]更新到nums[i]
问:
Q1:暴力解法时间复杂度??
Q2:while更好理解?
下面是自己写的,运行结果不对
#include<stdio.h>
int sqr(int* num, int size)
{
int i = 0, j = size - 1, k = size - 1;
while (i <= j) {
if (num[i] * num[i] < num[j] * num[j]) {
num[k] = num[j] * num[j];
k--;
j--;
}
else {
num[k] = num[i] * num[i];
k--;
i++;
}
}
return k;
}
int main()
{
int num[] = { -15,5,7,12,14 };
int size = 5;
int a = sqr(num, size);
int i;
for (i = 0; i < size; i++) {
printf("%d,%d\n", i, num[i]);
}
return 0;
}
滑动窗口:
暴力解法:超时
双指针:
注意事项:
1.写while而不写if,因为写if的话只会执行一次i指针的向右移动,但如果向右移动一次i指针后仍然符合数组和≥s,则还要移动i指针,此时就需要while
2.建立在有序排列的基础上
3.result的初始值为MAX,这样才能和subL比较持续更新result的值
4.一开始的for循环里面的j指针属于右指针,j=0;j<numSize;j++
5.下图第13行:给minLength赋值,用等号;第18行:进行判断,用双等号
问题:
1.时间复杂度O(n)??
下面是自己写的,仍然运行结果仍然错误,明天回来debug
#include<stdio.h>
int Leet(int num[], int size, int s)
{
int minL = size;
int i = 0, j = 0;
int sum = 0;
while (j < size)
{
int k = i;
if (k <= j) {
for (; k <= j; k++) {
sum += num[k];
}
}
else sum = 0;
if (sum < s)
{
j++;
}
else {
int L = j - i + 1;
minL = L < minL ? L : minL;
i++;
}
}
return minL;
}
int main()
{
int num[] = { 2,3,1,2,4,3 };
int size = 6;
int s = 7;
int a = Leet(num, size, s);
printf("%d\n", a);
return 0;
}
螺旋矩阵先鸽着