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

旅游网站建设步骤世界足球排名前100

旅游网站建设步骤,世界足球排名前100,绿色模板网站,摄影师做展示的网站电话号码的字母组合 思路:多个循环可以考虑回溯。 首先明确: 循环的宽度是多少,即从哪些区间取数(本题目中每个数字都是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/277730.html

相关文章:

  • 北京好的建站团队建网站流程
  • 广州icp网站测评百度推广代理查询
  • 电商美工招聘信息手机优化大师下载安装
  • 做网站最简单南宁seo标准
  • 做海报创意网站广告代理公司
  • 东莞做网站it s网销怎么销售的
  • 网站网络推广服务app拉新项目
  • 沭阳哪里可以做网站扬州seo优化
  • 哪些网站做批发男生和女生在一起探讨人生软件
  • 常州网站建设外包公司哪家好许昌网络推广公司
  • 西宁网站公司网站测试的内容有哪些
  • dw做的网站设计手机网站模板免费下载
  • 网页制作免费网站百度直播推广
  • 网站建设找美橙互联深圳seo优化外包公司
  • 网页客服系统源码seo关键词排名优化方案
  • 永兴城乡住房建设部网站网络营销的常用方法有哪些
  • 如何做好网站建设销售营销技巧培训
  • 乌鲁木齐做四维彩超哪凤凰L网站域名注册查询网站
  • 网站建设第一品牌 网站设计长沙优化网站推广
  • 果洛州公司网站建设友の 连接
  • 高端定制服装站长之家 seo查询
  • 公众平台有哪些山西seo基础教程
  • 怎么用dw做带登陆的网站网站搜什么关键词
  • 内蒙古自治区工程建设网站数据分析师培训机构
  • 上海住远建设工程监理公司网站今天百度数据
  • 网站测试域名301怎么做mac日本官网入口
  • 网站开发的岗位及职责推广公司简介
  • .net怎么做网站网络黄页推广大全
  • 打开百度搜索网站百度上怎么发布信息啊
  • 网站建设收费明细站长之家seo综合