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

安吉做网站免费建网站软件哪个好

安吉做网站,免费建网站软件哪个好,帮人家做网站,wordpress 3 小工具运行php对回溯的更深层理解: 对回溯和递归有了更深一层的了解,知晓了: 在循坏外面为横向一层都可以保留的在循环内部为纵向一层都可以保留的;需要回滚的是循环内部的,即纵向的。 全排列1:(不重复&am…

对回溯的更深层理解:

对回溯和递归有了更深一层的了解,知晓了:

  • 在循坏外面为横向一层都可以保留的
  • 在循环内部为纵向一层都可以保留的;
  • 需要回滚的是循环内部的,即纵向的。

全排列1:(不重复)

链接:

https://leetcode.cn/problems/permutations/description/

题目:

方法一:
class Solution {public List<List<Integer>> ans=new ArrayList<>();public List<Integer> com=new ArrayList<>();public List<List<Integer>> permute(int[] nums) {int n=nums.length;traceBack(nums);return ans;}public void traceBack(int[] nums){if(com.size()==nums.length){ans.add(new ArrayList(com));return;}for(int i=0;i<=nums.length;i++){if(com.contains(nums[i])) continue;com.add(nums[i]);traceBack(nums);com.remove(com.size()-1);}}
}

解释:

  • ans表示答案,是每一个排列的集合;
  • com表示每一个不同的排列;
  • 都从头开始遍历,如果在纵向中出现过一次,那么就舍去出现过的。即 if(com.contains(nums[i])) continue;
方法二(开辟额外数组记录状态)
class Solution {public List<Integer> com=new ArrayList<>();public List<List<Integer>> ans=new ArrayList<>();public List<List<Integer>> permute(int[] nums) {int n=nums.length;boolean[] used=new boolean[n];traceBack(nums,used);return ans;}public void traceBack(int[] nums,boolean[] used){if(com.size()==nums.length){ans.add(new ArrayList(com));return ;}for(int i=0;i<nums.length;i++){if(used[i]==true) continue;com.add(nums[i]);used[i]=true;traceBack(nums,used);used[i]=false;com.remove(com.size()-1);}}
}

解释:

  • ans表示答案,是每一个排列的集合;
  • com表示每一个不同的排列;
  • usde表示第i个是否被使用过;
  • 都从头开始遍历,如果在纵向中出现过一次,那么就舍去出现过的。我们用used数组来记录,出现过就使used[i]==true,回滚使也要把used[i]给还原了。

全排列2:(可以重复)

题目:
链接:

https://leetcode.cn/problems/permutations-ii/description/

全排列2中为什么要去去重:

如图所示,第一行中的第一个1和第2个1,最终的结果一样,所以第二个1就没有存在的必要了。

在第一行中的元素2,他的下一行,有两个一样的1,这样也会使结果一样,所以第二个1没有存在的必要

方法一(使用.contains()来判断是否重复):
class Solution {public List<Integer> com=new ArrayList<>();public List<List<Integer>> ans=new ArrayList<>();public List<List<Integer>> permuteUnique(int[] nums) {int n=nums.length;boolean[] used=new boolean[n];traceBack(nums,used);return ans;}public void traceBack(int[] nums,boolean[] used){if(com.size()==nums.length){if(!ans.contains(new ArrayList(com))){ans.add(new ArrayList(com));}return ;}for(int i=0;i<nums.length;i++){if(used[i]==true) continue;com.add(nums[i]);used[i]=true;traceBack(nums,used);used[i]=false;com.remove(com.size()-1);}}
}

解释:

  • ans表示答案,是每一个排列的集合;
  • com表示每一个不同的排列;
  • used表示第i个是否被使用过;
  • 都从头开始遍历,如果在纵向中出现过一次,那么就舍去出现过的。我们用used数组来记录,出现过就使used[i]==true,回滚使也要把used[i]给还原了。
  • 使用ans.contains()来判断,重复就直接return;

这种方法能写,但是非常的低效,不推荐;

方法二(在循环外面创建新的辅助状态):
class Solution {public List<Integer> com=new ArrayList<>();public List<List<Integer>> ans=new ArrayList<>();public List<List<Integer>> permuteUnique(int[] nums) {int n=nums.length;boolean[] used=new boolean[n];traceBack(nums,used);return ans;}public void traceBack(int[] nums,boolean[] used){if(com.size()==nums.length){ans.add(new ArrayList(com));return ;}boolean[] used2=new boolean[21];//在循环外代表每一行,循环内代表每一列。//这个used2的意思是:如果在同一分支中有相同的数字,那么必然重复,所以就直接剪枝即可。for(int i=0;i<nums.length;i++){if(used2[nums[i]+10]) continue;if(used[i]) continue;used2[nums[i]+10]=true;used[i]=true;com.add(nums[i]);traceBack(nums,used);used[i]=false;com.remove(com.size()-1);}}
}

解释:

  • ans表示答案,是每一个排列的集合;
  • com表示每一个不同的排列;
  • used表示第i个是否被使用过;
  • used2表示nums[i]这个数在横向中是否出现过,如果出现过就直接continue;
疑问点

为什么used2要开辟21的空间,为什么下标要nums[i]+10?

解释:因为题中的数据范围给出了nums[i]在-10到10的范围内,所以开辟21个空间,再+10是一种映射,使每一种情况都能表示;

那么就有帅气的同学问了,有没有更简洁高效的回溯方法来解决,有的兄弟,有的:

方法三(先排序,再记录横向上一个元素last来代替used2)
class Solution {public List<Integer> com=new ArrayList<>();public List<List<Integer>> ans=new ArrayList<>();public List<List<Integer>> permuteUnique(int[] nums) {int n=nums.length;boolean[] used=new boolean[n];Arrays.sort(nums);traceBack(nums,used);return ans;}public void traceBack(int[] nums,boolean[] used){if(com.size()==nums.length){ans.add(new ArrayList(com));return ;}int last=6666;// boolean[] used2=new boolean[21];//在循环外代表每一行,循环内代表每一列。//这个used2的意思是:如果在同一分支中有相同的数字,那么必然重复,所以就直接剪枝即可。for(int i=0;i<nums.length;i++){// if(used2[nums[i]+10]) continue;if(used[i]) continue;// used2[nums[i]+10]=true;if(last==nums[i]) continue;last=nums[i];used[i]=true;com.add(nums[i]);traceBack(nums,used);used[i]=false;com.remove(com.size()-1);}}
}
  • ans表示答案,是每一个排列的集合;
  • com表示每一个不同的排列;
  • used表示第i个是否被使用过;
  • last表示横向中的上一个使用的元素,如果当前元素与上一个元素一样,直接continue。
疑问点:

为什么last在循环外面?

解释:last为横向的上一个,所以要在循环外面,这也是为什么回溯函数不用给last额外去创造一个形参;

为什么last的初始值为6666;

解释:因为数据范围nums[i]为-10到10,所以我们需要选一个不在该范围内的数字用来初始化(没有实际意义),如果你像换可以随便换成-10到10意外的任何数字,比如7777;

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

相关文章:

  • 网络推广网站培训班网站注册查询官网
  • 网站建设收费标准好么什么是搜索关键词
  • 设计灵感网站整理百度云盘登录入口
  • 网站建设 深圳宝安免费自动推广手机软件
  • 金华住房与城乡建设部网站怎么上百度推广产品
  • 电脑网站怎么做的网络营销实践总结报告
  • 哈尔滨做网站需要多少钱网站建设情况
  • 怎么在网上免费做公司网站四平网络推广
  • vps可以多少wordpressseo的搜索排名影响因素有哪些
  • 用腾讯云做会员网站如何提升百度关键词排名
  • 四平做网站佳业首页怎么免费注册域名
  • 临河网站建设郑州seo优化推广
  • 商城网站建站企业网站seo优化
  • 做淘宝必备的网站如何建立自己的博客网站
  • 做网络平台的网站bt兔子磁力搜索引擎最新版
  • 三亚网站开发万网官网域名注册
  • 成都网站建设 哪家比较好seo百度发包工具
  • 策划营销型企业网站应注意哪些事情(建设流层—)百度关键词排名用什么软件
  • 做网站营销公司排名个人网页制作完整教程
  • 建设银行网站登录首页seo助理
  • 团购网站APP怎么做深圳网络营销技巧
  • 橱柜网站源码google adwords关键词工具
  • 企业网站哪家做得好搜索引擎营销的步骤
  • 杭州做产地证去哪个网站温州seo公司
  • 全国网站建设公司有多少家线下营销推广方式有哪些
  • 台山网页设计培训成都seo优化排名推广
  • 三亚住房和城乡建设厅网站百度客服中心人工在线电话
  • 冒用公司名义做网站经营管理培训课程
  • 如何自己做解析网站营销的主要目的有哪些
  • 天津 网站备案服务器域名查询