当前位置: 首页 > Web前端 > HTML

31.下一个安排-算法(leetode,附思维导图+全解)300题

时间:2023-03-28 18:22:42 HTML

零题目:算法(leetode,附思维导图+全解)300题(31)下一篇安排1题目描述概述二解(思维导图)全三解决方案1??方案11)代码://方案1“双指针法”。//通过:213/265。失败示例:[4,2,0,2,3,2,0]。//技巧:“双指针”多适用于“数组”(双向,前向后向),“链表”(仅单向后向)。//因为“算法适合数据结构”——类似于生物学中的“结构适合功能”。//思路://1)2)使用i(range:[l-1,1]),j(range:[i-1,0])双指针//2.1)找到匹配nums[i]>nums[j]条件的下标i和j//2.1.1)“价值交换”//2.1.2)将nums下标后的数字重新排列,(j+1)升序排列//3)边界交易和。如果此时nums是最大排列,可以直接将nums重新排列成升序~varnextPermutation=function(nums){//1)状态初始化constl=nums.length;//2)使用i(range:[l-1,1]),j(range:[i-1,0])双指针for(leti=l-1;i>=1;i--){for(letj=i-1;j>=0;j--){//2.1)找到满足nums[i]>nums[j]条件的i和j下标if(nums[i]>nums[j]){//2.1.1)执行“价值交换”[nums[i],nums[j]]=[nums[j],nums[i]];//2.1.2)对于nums,(j+1)下标数字升序排列后lettempList=nums.slice(j+1);tempList.sort((a,b)=>a-b);nums.splice(j+1,(l-j-1),...tempList);返回;}}}//3)边界处理。如果此时nums是最大排列,直接将nums重新排列成升序即可~nums=nums.sort((a,b)=>a-b);};2方案21)代码://方案2》程序别人的”。//参考://1)https://leetcode-cn.com/problems/next-permutation/solution/jie-fa-hen-jian-dan-jie-shi-qi-lai-zen-yao-jiu-na-/varnextPermutation=function(nums){constl=nums.length;让我=升-2;//从右向左遍历得到第一个左边小于右边的i,i右边的数组为while(i>=0&&nums[i]>=nums[i+1]){我-;}if(i>=0){让j=l-1;//从右向左遍历得到第一个大于nums[i]的数,因为nums[i]之前是第一个比他右边小的数,所以他右边一定有比他大的数while(j>=0&&nums[j]<=nums[i]){j--;}//交换两个数[nums[j],nums[i]]=[nums[i],nums[j]]}//交换i右边的数//因为右边的数i的本来是从右向左递增的,交换一个较小的值后,仍然保持单调递增的性质//此时可以交换头尾,向中间趋近得到右边序列的最小值我让左=我+1;让右=l-1;while(left