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

乐山旅游英文网站建设怎样推广产品

乐山旅游英文网站建设,怎样推广产品,西安做网站,wordpress迁移数据库电话号码的字母组合 思路:多个循环可以考虑回溯。 首先明确: 循环的宽度是多少,即从哪些区间取数(本题目中每个数字都是3个字母,都是从三个字母中取一个数,所以可以确定循环宽度就是每个数字对应的字符串…

电话号码的字母组合

思路:多个循环可以考虑回溯。

首先明确:

  1. 循环的宽度是多少,即从哪些区间取数(本题目中每个数字都是3个字母,都是从三个字母中取一个数,所以可以确定循环宽度就是每个数字对应的字符串的长度)
  2. 循环的高度是多少,即循环终止条件(分别从每个数字里取一个字母,所以循环高度就是给出的数字的数量)
  3. 循环的区间是什么,用什么可以统一表达并递归(字母的联系是数字,需要找出每层循环中的循环数字,那就使用Index取数字)
  4. 是否需要剪枝:如果求sum问题可以提前剪枝,本题目不用
class Solution {List<String> res = new ArrayList<>();List<String> sub = new ArrayList<>();StringBuffer sb = new StringBuffer();Map<Character, String> map = new HashMap<>(); //Character用的好int n = 3;public List<String> letterCombinations(String digits) {int len = digits.length(); //几层--循环宽度if(len == 0){return res;}map.put('2', "abc"); //找出对应关系map.put('3', "def");map.put('4', "ghi");map.put('5', "jkl");map.put('6', "mno");map.put('7', "pqrs");map.put('8', "tuv");map.put('9', "wxyz");fucLetter(digits, len, 0);return res;}public void fucLetter(String digits, int len, int Index){if(sb.length() == len){res.add(sb.toString());return;}char c = digits.charAt(Index); //找到每个数字String s = map.get(c); // 取出对应字符串for(int i = 0; i < s.length(); i++){ //循环字符串sb.append(s.charAt(i));fucLetter(digits, len, Index + 1);sb.deleteCharAt(sb.length() - 1);}}
}

组合总和

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> sub = new ArrayList<>();int target;public List<List<Integer>> combinationSum(int[] candidates, int target) {this.target = target;Arrays.sort(candidates); // 剪枝的话先进行排序fucSum(candidates, 0, 0);return res;}public void fucSum(int[] candidates, int sum, int startIndex){if(sum > target){return;}if(sum == target){res.add(new ArrayList<>(sub));return;}for(int i = startIndex; i < candidates.length; i++){ //从startIndex开始if(sum + candidates[i] > target){break; //这个不要return,直接break} //这个剪枝注意一下sub.add(candidates[i]);sum += candidates[i];fucSum(candidates, sum, i); //允许可以重复,从当前元素即可!sub.remove(sub.size() - 1);sum -= candidates[i];}}
}

组合总和II

  1. 思路1:去除重复的集合,但是if(i != 0 && candidates[i] == candidates[i - 1])单纯这样写是不够的,因为这样也把纵向重复去除了(纵向重复并不会导致集合重复)!!!区分纵向和横向的关系:纵向是递归,横向是回溯,只有return后才是回溯,所以还是需要一个标注代表是同一层还是同一纵,用boolean use[] = new boolean[candidates.length]来记录,正常纵向递归时标注为true,回溯时变为false。
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> sub = new ArrayList<>();boolean use[];public List<List<Integer>> combinationSum2(int[] candidates, int target) {use = new boolean[candidates.length]; //默认为falseArrays.sort(candidates); // 剪枝前先进行排序fucCombine(candidates, target, 0, 0);return res;}public void fucCombine(int[] candidates, int target, int startIndex, int sum){if(sum > target){return;}if(sum == target){res.add(new ArrayList<>(sub));return;}for(int i = startIndex; i < candidates.length; i++){if(i != 0 && candidates[i] == candidates[i - 1] && use[i - 1] == false){ //单纯这样写是不够的,因为这样也把纵向重复去除了!区分纵向和横向的关系:纵向是递归,横向是回溯,只有return后才是回溯continue;}if(candidates[i] + sum > target){break;}use[i] = true;sub.add(candidates[i]);sum += candidates[i];fucCombine(candidates, target, i + 1, sum);sub.remove(sub.size() - 1);sum -= candidates[i];use[i] = false;}}
}
  1. 思路2:使用if(i > startIndex && candidates[i] == candidates[i - 1])去重!!天才!!ifi > startIndex说明是同一层的for循环!!直接去重
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> sub = new ArrayList<>();public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates); // 剪枝前先进行排序fucCombine(candidates, target, 0, 0);return res;}public void fucCombine(int[] candidates, int target, int startIndex, int sum){if(sum > target){return;}if(sum == target){res.add(new ArrayList<>(sub));return;}for(int i = startIndex; i < candidates.length; i++){if(i > startIndex && candidates[i] == candidates[i - 1]){continue;}if(candidates[i] + sum > target){break;}sub.add(candidates[i]);sum += candidates[i];fucCombine(candidates, target, i + 1, sum);sub.remove(sub.size() - 1);sum -= candidates[i];}}
}

回溯注意事项

  1. 何时定义startIndex,即循环从startIndex开始,例如: for(int i = startIndex; i < candidates.length; i++) ?当每一层要循环的区间有关联时,不允许跟之前重复,此时循环从startIndex开始。
  2. 递归时startIndex的值如何赋予?如果要求一个元素只能出现一次
    ,那么使用i+1,即:fucSum(candidates, sum, i+1); 否则使用i,即:fucSum(candidates, sum, i)
  3. 剪枝优化

写博客的目的是每日督促并记录刷题,也欢迎大家批评指正~(day25)

http://www.dtcms.com/wzjs/197050.html

相关文章:

  • 唐山官方网站建设网页优化怎么做
  • 怎么做网站步骤好的竞价推广托管
  • 登录注册seo网站设计
  • wep购物网站开发模板开鲁视频
  • 做网站的厂家代写1000字多少钱
  • 手机网站制作与建设正规百度推广
  • 主机网站建设今日新闻头条新闻最新
  • 重庆网站制作外包站外推广平台有哪些
  • 手机app开发需要哪种语言seo营销的概念
  • 京东网站建设的详细策划网络推广公司深圳
  • 网站架设流程网络营销运营策划
  • 上海公司企业网站怎么做营销网站建设教学
  • 用ps做美食网站1小时快速搭建网站
  • 网站设计用什么软件做的百度网盘资源搜索引擎
  • 摄影作品可以在哪些网站投稿seo网页优化平台
  • 做网站还要写文章吗网站营销
  • 辽宁大学网站怎么做软件开发公司简介
  • 深圳新增疫情活动轨迹上海网站快速排名优化
  • 酒店怎样做网站好评简述网络营销与传统营销的整合
  • 如何自己制作公司网站想做app推广项目在哪找
  • 义乌网站建设现状求网址
  • 科研平台网站建设计划优化大师下载安装免费
  • 佛山网站建设外包站长工具中文精品
  • app公司组织结构图资阳地seo
  • 建筑培训网课宁波网站制作优化服务
  • 网站广告代理如何做手机优化大师官方免费下载
  • 网店推广新思维苏州seo招聘
  • wordpress 自定义内容类型优化大师下载电脑版
  • 一区适合晚上一个人看b站谷歌官方app下载
  • 做网站资讯新手怎样做网络推广