• 算法分析与设计编程题 递归与分治策略


    棋盘覆盖

    题目描述

    请添加图片描述

    请添加图片描述

    解题代码

    // para: 棋盘,行偏移,列偏移,特殊行,特殊列
    void dividedCovering(vector<vector<int>>& chessBoard, int dr, int dc, int sr, int sc, int size) {
    	if (size == 1) return;
    	size /= 2; // 划分为四部分
    	if (sr < dr + size && sc < dc + size) { // 特殊点位于左上部分
    		divideCovering(chessBoard, dr, dc, sr, sc, size);
    	}
    	else {
    		int nr = dr + size - 1, nc = dc + size - 1; // 新覆盖点
    		chessBoard[nr][nc] = 1;
    		divideCovering(chessBoard, dr, dc, nr, nc, size);
    	}
    	if (sr < dr + size && sc >= dc + size) { // 特殊点位于右上部分
    		divideCovering(chessBoard, dr, dc + size, sr, sc, size);
    	}
    	else {
    		int nr = dr + size - 1, nc = dc + size;
    		chessBoard[nr][nc] = 1;
    		divideCovering(chessBoard, dr, dc + size, nr, nc, size);
    	}
    	if (sr >= dr + size && sc < dc + size) { // 特殊点位于左下部分
    		divideCovering(chessBoard, dr + size, dc, sr, sc, size);
    	}
    	else {
    		int nr = dr + size, nc = dc + size - 1;
    		chessBoard[nr][nc] = 1;
    		divideCovering(chessBoard, dr + size, dc, nr, nc, size);
    	}
    	if (sr >= dr + size && sc >= dc + size) { // 特殊点位于右下部分
    		divideCovering(chessBoard, dr + size, dc + size, sr, sc, size);
    	}
    	else {
    		int nr = dr + size, nc = dc + size;
    		chessBoard[nr][nc] = 1;
    		divideCovering(chessBoard, dr + size, dc + size, nr, nc, size);
    	}
    }
    
    void chessBoardCovering(vector<vector<int>>& chessBoard, int sr, int sc) {
    	int n = chessBoard.size();
    	divideCovering(chessBoard, 0, 0, sr, sc, n);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    线性时间选择

    题目描述

    请添加图片描述

    解题代码

    int partition(vector<int>& nums, int left, int right) {
    	int randIdx = rand() % (right - left + 1) + left; // 选取随机pivot
    	swap(randIdx, nums[left]);
    	int pivot = nums[left];
    	while (left < right) {
    		while (left < right && nums[right] >= pivot) --right;
    		nums[left] = nums[right];
    		while (left < right && nums[left] <= pivot) ++left;
    		nums[right] = nums[left];
    	}
    	nums[left] = pivot;
    	return left;
    }
    
    int dividedQuickSelect(vector<int>& nums, int left, int right, int k) {
    	if (left >= right) return nums[left];
    	int p = partition(nums, left, right); // 根据基准进行划分
    	if (p == k) return nums[p]; // 划分基准正好为第k小的数
    	else if (p > k) return divideQuickSelect(nums, left, p - 1, k); // 基准大于第k小
    	else return divideQuickSelect(nums, p + 1, right, k); // 基准小于第k小
    }
    
    int quickSelect(vector<int>& nums, int k) {
    	srand((unsigned)time(nullptr)); // 设定随机种子
    	return divideQuickSelect(nums, 0, nums.size() - 1, k - 1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    ReentarantLock源码浅析
    文献学习(part102-A)--Autoencoders
    CAS、AtomicInteger、synchronized原理
    数字电路基础-COMS电路静态、动态功耗,低功耗设计
    JMeter之Websocket测试
    [C++]读取bmp文件的rgb数据及exited with code=3221225477错误处理
    蓝桥等考Python组别十八级005
    Hutool的BeanUtil.copyProperties() 的改进详情
    img为空时不显示
    第三章---堆栈队列 板子
  • 原文地址:https://blog.csdn.net/qq_37409526/article/details/132891714