当前位置: 首页 > news >正文

分治法 Divide and Conquer

1.分治法

分治法(Divide and Conquer)是一种常见的算法设计思想,它将一个大问题分解成若干个子问题,递归地解决每个子问题,最后将子问题的解合并起来得到整个问题的解。分治法通常包含三个步骤:

  • 1. Divide:将问题分解成若干个子问题。
  • 2. Conquer:递归地解决每个子问题。
  • 3. Combine:将子问题的解合并起来得到整个问题的解。

分治法的主要思想是将问题分解成若干个相互独立的子问题,通过递归地解决每个子问题,最后将子问题的解合并起来得到整个问题的解。这种思想可以应用于许多问题的解法中,如排序、搜索、图论、数学计算等等。

一些常见的使用分治法的算法包括:归并排序、快速排序、二分搜索、线性时间选择、Karatsuba 算法等等。

2.练习题

1)

力扣https://leetcode.cn/problems/different-ways-to-add-parentheses/解题思路:

依次遍历字符串的每个字符,如果是运算符,就递归计算左边和右边的值。

class Solution {
public:vector<int> diffWaysToCompute(string expression) {int n = expression.size();vector<int> res;for(int i=0;i<n;i++){char c = expression[i];if(c=='+'||c=='-'||c=='*'){vector<int> left = diffWaysToCompute(expression.substr(0,i));vector<int> right = diffWaysToCompute(expression.substr(i+1));for(auto l:left){for(auto r:right){switch(c){case '+':   res.push_back(l+r);break;case '-':   res.push_back(l-r);break;case '*':   res.push_back(l*r);break;}}}}}if(res.empty()) res.push_back(stoi(expression));return res;}};

2)

力扣icon-default.png?t=N6B9https://leetcode.cn/problems/beautiful-array/description/

解题思路:

首先确定一点,怎么满足这个条件:

  • 对于每个 0 <= i < j < n ,均不存在下标 ki < k < j)使得 2 * nums[k] == nums[i] + nums[j] 。

最简单的方法就是让右边的nums[i] + nums[j] 这个表达式的值为奇数,因为2 * nums[k]肯定是偶数。这样我们可以假设i<j,且nums[i]为奇数,nums[j]为偶数。也就是让数组左边为奇数,右边为偶数。

又因为如果A是漂亮数组,那么a*A+b还是漂亮数组。

所有我们可以用分治法,将问题从大到小拆解,先满足每个长度为1、2、3......的数组都是漂亮数组,这样最后长度为n的数组也是漂亮数组。

代码:

class Solution {
public:vector<int> beautifulArray(int n) {vector<int> res(n,1);part(0,n-1,res);return res;}void part(int left, int right, vector<int>& res){if(left>=right) return;int mid = left + (right-left)/2;part(left, mid, res);part(mid+1, right, res);for(int i=left;i<=mid;i++){res[i] = 2*res[i]-1;}for(int i=mid+1;i<=right;i++){res[i] = 2*res[i];}}
};

http://www.lryc.cn/news/102952.html

相关文章:

  • super(Module_ModuleList, self).__init__()的作用是什么?
  • 【并发专题】操作系统模型及三级缓存架构
  • java基础复习(第二日)
  • Ansible自动化运维工具
  • LeetCode-116-填充每个节点的下一个右侧节点指针
  • 前端面试的性能优化部分(3)每篇10题
  • 如何通过企业工商信息初步判断企业是否靠谱?
  • ChatGPT+知乎,20分钟超越专业大V的调教方法
  • git branch --show-current 和 git rev-parse --abbrev-ref HEAD 区别
  • 【TypeScript】接口类型 Interfaces 的使用理解
  • 2023-07-31 C语言根据错误号打印详细的错误信息perror(““) 或者strerror(errno)
  • JDK17和JDK8完美卸载方法及新版JDK安装教程
  • FPGA设计时序分析二、建立/恢复时间
  • oracle建立自动增长字段
  • 【Git】远程仓库的创建、SSH协议克隆、拉取、推送
  • C#之泛型
  • Scrum敏捷开发管理流程+scrum工具免费
  • 【操作系统基础】Linux 中 /var/log/ 文件夹下通常有哪一些文件?分别的作用是什么?
  • 【构造】CF1758 C
  • 【etcd】docker 启动单点 etcd
  • 【单链表OJ题:反转链表】
  • Unity UGUI的LayoutRebuilder的介绍及使用
  • 深刻理解python特性-列表推导式和生成器表达式
  • Sentinel dashboard的使用;Nacos保存Sentinel限流规则
  • vue学习之插值表达式{{}}与显示数据(v-text和v-html)
  • 2,认识N(logN)的排序【p3】
  • 华为机考--服务失效判断--带答案
  • C++对C的加强(全)
  • ES6及以上新特性
  • 伦敦金在非农双向挂单