代码随想录算法训练营第二天 | 数组- 滑动窗口-循环不变量

977有序数组的平方

1.暴力算法(先平方,后排序)的时间复杂度是O(n+logn),没有充分有序性
2.双指针法

  • 相向的双指针,利用有序性(从两侧出发找较大值)
  • 新数组—辅助空间
    • vector的初始化参考
    • 关于局部变量result的return,vector的初始化是动态内存分配
vector<int> sortedSquares(vector<int>& nums) {

	int k = nums.size()-1;
	vector<int> result(nums.size(), 0);  //初始化:确定新数组大小,赋初值为0

	for (int l=0,r = k; l<=r;) {
		if (nums[l] * nums[l] < nums[r] * nums[r])
		{
			result[k--] = nums[r] * nums[r];
			r--;
		}
		else {
			result[k--] = nums[l] * nums[l];
			l++;
		}
	}
	return result;
}

209长度最小的子数组(滑动窗口)

  • 子数组范围[i,j],i是起始位置,j是终止位置,i必然≤j,j决定循环的终止
int minSubArrayLen(int target, vector<int>& nums) {
	int i = 0, j = 0;
	int min = 100001;
	int sum = 0;

	for (int j = 0; j < nums.size(); j++) {
		sum += nums[j];
		while (sum >= target) {
			if (min > j - i + 1)
				min = j - i + 1;
			sum -= nums[i++];
		}
	}
	if (min == 100001)
		return 0;
	return min;
}

时间复杂度:虽然有两层循环,i、j两个指针同向遍历了整个数组,O(2n)=O(n)


59螺旋矩阵II(统一的左闭右开区间)

循环不变量:每条边的处理规则要统一

vector<vector<int>> generateMatrix(int n) {
	vector<vector<int>> matrix(n,vector<int>(n, 0));
	int offset = 1;
	int startx = 0, starty = 0;
	int loop = n / 2;
	int i, j;
	int count = 1;
    
    //if (n % 2 == 1)
	//matrix[n / 2][n / 2] = n * n;

	while (loop--) {    //n是边长,除以2就是圈数
		for (j = startx; j < n - offset; j++)    //左闭右开
			matrix[starty][j] = count++;

		for (i = starty; i < n - offset; i++)
			matrix[i][j] = count++;

		for (; j > startx; j--)
			matrix[i][j] = count++;

		for (; i > starty; i--)
			matrix[i][j] = count++;

		startx++;
		starty++;
		offset++;    //n--;
	}
	if (n % 2 == 1)
		matrix[n / 2][n / 2] = count;
	return matrix;
}
posted @   daydayup_cpp  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示