系列完结撒花,准备开启整理模式

2022.3.7

一、 206. 反转链表

二、 剑指 Offer 24. 反转链表

/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*/
/*** @param {ListNode} head* @return {ListNode}*/
var reverseList = function(head) {if (head === null || head.next === null) return head;let prev = null;             // 定义一个前驱节点let cur = head;              // 定义一个当前节点while (cur) {let next = cur.next;     // 定义一个后继节点// 执行交换操作cur.next = prev;prev = cur;cur = next;}return prev;
};

2022.3.9

一、 剑指 Offer II 024. 反转链表[递归]

给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。

/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @return {ListNode}*/
var reverseList = function(head) {if(head === null || head.next === null)return head;// 递归反转let last = reverseList(head.next)head.next.next = head;head.next = null;return last;};

2022.3.10

一、 92. 反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

1-1 迭代

/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @param {number} left* @param {number} right* @return {ListNode}*/var reverseBetween = function(head, left, right) {// 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论const dummyNode = new ListNode(-1);dummyNode.next = head;let pre = dummyNode;// 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点// 建议写在 for 循环里,语义清晰for (let i = 0; i < left - 1; i++) {pre = pre.next;}// 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点let rightNode = pre;for (let i = 0; i < right - left + 1; i++) {rightNode = rightNode.next;}// 第 3 步:切断出一个子链表(截取链表)let leftNode = pre.next;let curr = rightNode.next;// 注意:切断链接pre.next = null;rightNode.next = null;// 第 4 步:同第 206 题,反转链表的子区间reverseLinkedList(leftNode);// 第 5 步:接回到原来的链表中pre.next = rightNode;leftNode.next = curr;return dummyNode.next;
};const reverseLinkedList = (head) => {let pre = null;let cur = head;while (cur) {const next = cur.next;cur.next = pre;pre = cur;cur = next;}
}// var reverseBetween = function(head, left, right) {//     // 记录下头结点
//     const dummyNode = new listNode(-1);
//     dummyNode.next = head;
//     let pre = dummyNode;
//     // 迭代
//     for(let i = 0; i< left - 1; i++){//         // 循环结束per的值为left所在结点
//         pre =  pre.next
//     }
//     let rightNode = pre;
//     for(let j = 0; j < right-left+1; j++){//         // 循环结束后找到有边界
//         rightNode = rightNode.next;
//     }//     //----------截取链表-------
//     let leftNode = pre.next;
//     pre.next = null;
//     let curr = rightNode.next;
//     rightNode.next = null;//     // 迭代反转链表
//     reverseLinkedList(leftNode);//     // 接回 原来的链表中
//     pre.next = rightNode;
//     leftNode.next = curr;//     return dummyNode.next;
// };// const reverseLinkedList = (head) =>{//     let pre = null;
//     let cur = head;//     while (cur) {//         const next = cur.next;
//         cur.next = pre;
//         pre = cur;
//         cur = next;
//     }
// }

要被气死了!!!!

2022.3.11

1-2 秀操作之递归

  1. 25. K 个一组翻转链表
/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @param {number} k* @return {ListNode}*/
var reverseKGroup = function(head, k) {if(head === null) return null;// 定义左右节点let right=left = head;// 迭代找到第n组的第k个结点for(let i = 0; i < k ; i++) {// base case : 该组不够k个节点if (right === null) {return head;} right = right.next;}// 反转前k个元素let newHead = reverse(left, right);left.next = reverseKGroup(right, k);return newHead};const reverse = ( a,b ) => {let pre = null,cur = a,nxt = a;while(cur != b) {nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;} return pre;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkauVOKz-1647174009087)(C:/Users/Hannah/AppData/Roaming/Typora/typora-user-images/image-20220312204506879.png)]

2022.3.12

46. 全排列

1-1-1 别人的解法

// ---- 解法一--------
// var permute = function(nums) {//     const res = []
//     const backtrack = (path) => {//         if(path.length === nums.length) {//             res.push(path)
// console.log(res);
//             return
//         }
//         nums.forEach(n => {//             if(path.includes(n)) return;
//             backtrack(path.concat(n))
//         })
//     }
//     backtrack([])
//
//     return res
// };// 0--------------解法二 ----------
// /**
//  * @param {number[]} nums
//  * @return {number[][]}
//  */
// const permute = (nums) => {//   // 1. 设置结果集
//   const result = [];//   // 2. 回溯
//   const recursion = (path, set) => {//     // 2.1 设置回溯终止条件
//     if (path.length === nums.length) {//       // 2.1.1 推入结果集
//       result.push(path.concat());//       // 2.1.2 终止递归
//       return;
//     }//     // 2.2 遍历数组
//     for (let i = 0; i < nums.length; i++) {//       // 2.2.1 必须是不存在 set 中的坐标
//       if (!set.has(i)) {//         // 2.2.2 本地递归条件(用完记得删除)
//         path.push(nums[i]);
//         set.add(i);//         // 2.2.3 进一步递归
//         recursion(path, set);//         // 2.2.4 回溯:撤回 2.2.2 的操作
//         path.pop();
//         set.delete(i);
//       }
//     }
//   };
//   recursion([], new Set());//   // 3. 返回结果
//   return result;
// };// console.log(permute([1, 2, 3]));
/*** @param {number[]} nums* @return {number[][]}*/
var permute = function(nums) {let res = [];let track = [];backtrack(nums, track);return  res;
};const backtrack = (nums, track) => {// 结束条件if(track.length === nums.length) {res.concat(track);return;}for(let i = 0; i < nums.length; i++) {if(track.indexOf(nums[i]) !== -1) continue;// 做选择track.push(nums[i]);backtrack(nums, track);// 取消选择track.remove();}
}

1-1-2 My

离谱了就,每次都是啥原因引发的奇奇怪怪的问题,真是…啊,西巴!!!

每次出来的结果着实吓我一跳,和我的思路不在一条线上,睡!!!

找了n个题解,对了半天,加了这么个东西:res.push(track.concat());就这么好了??????

浅浅 威胁 一下: 我还不知道理由,继续给我报错!!!!

  • 为了浅拷贝数组,把引用类型 重新定义指针,防止回溯影响到当前状态
  • […arr] ; arr.concat(); arr.slice()都可以
/*** @param {number[]} nums* @return {number[][]}*/var permute = function(nums) {let res = [];let track = [];const backtrack = (nums, track) => {// 结束条件if(track.length === nums.length) {res.push(track.concat());// console.log(res)return;}for(let i = 0; i < nums.length; i++) {if(track.indexOf(nums[i]) !== -1) continue;// 做选择track.push(nums[i]);backtrack(nums, track);// 取消选择track.pop();console.log(track)}}backtrack(nums, track);//  console.log(res)return  res;
};

这题解挺好,,哈哈哈哈,double 5%

2022.3.13

47. 全排列 II

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

回溯+剪支

/*** @param {number[]} nums* @return {number[][]}*/
var permuteUnique = function(nums) {const res = [];// 记录一组排列const track = [];//const record = new Array(nums.length)// 必须有序nums.sort((a,b) => a-b);const backtrack = (nums, track) => {// 其中一组回溯长度 == nums.length,加入全排列if(track.length === nums.length) {res.push(track.concat());return;}for (let i = 0 ; i<nums.length; i++) {// 该数使用过if(record[i]) continue;// 避免使用重复的排列// 重复的条件 : 前面有数 & 该数==前面的数 & 前面的数字没有被迫重复过if (i - 1 >=0 && nums[i] === nums[i-1] && !record[i-1]) {continue;}// 做选择track.push(nums[i])record[i] = truebacktrack(nums, track)// 取消选择 以及对该数的记录track.pop()record[i] = false}}backtrack(nums, track);return res;
};

数据结构系列三---[一周leetcode刷题记录3.7-3.13]相关推荐

  1. 数据结构系列二---[一周leetcode刷题记录]

    2022.2.27 一. 496. 下一个更大元素 I nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素. 给你两个 没有重复元素 ...

  2. LeetCode刷题记录15——21. Merge Two Sorted Lists(easy)

    LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) 目录 LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) ...

  3. LeetCode刷题记录14——257. Binary Tree Paths(easy)

    LeetCode刷题记录14--257. Binary Tree Paths(easy) 目录 前言 题目 语言 思路 源码 后记 前言 数据结构感觉理论简单,实践起来很困难. 题目 给定一个二叉树, ...

  4. LeetCode刷题记录12——232. Implement Queue using Stacks(easy)

    LeetCode刷题记录12--232. Implement Queue using Stacks(easy) 目录 LeetCode刷题记录12--232. Implement Queue usin ...

  5. LeetCode刷题记录7——824. Goat Latin(easy)

    LeetCode刷题记录7--824. Goat Latin(easy) 目录 LeetCode刷题记录7--824. Goat Latin(easy) 题目 语言 思路 后记 题目 题目需要将一个输 ...

  6. LeetCode刷题记录5——441. Arranging Coins(easy)

    LeetCode刷题记录5--441. Arranging Coins(easy) 目录 LeetCode刷题记录5--441. Arranging Coins(easy) 题目 语言 思路 后记 题 ...

  7. LeetCode刷题记录3——237. Delete Node in a Linked List(easy)

    LeetCode刷题记录3--237. Delete Node in a Linked List(easy) 目录 LeetCode刷题记录3--237. Delete Node in a Linke ...

  8. LeetCode刷题记录1——717. 1-bit and 2-bit Characters(easy)

    LeetCode刷题记录1--717. 1-bit and 2-bit Characters(easy) LeetCode刷题记录1--717. 1-bit and 2-bit Characters( ...

  9. LeetCode刷题记录——17电话号码的字母组合

    LeetCode刷题记录--17电话号码的字母组合 一 题目描述: 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合.给出数字到字母的映射如下.注意1不对应任何字母 示例: 输入:&quo ...

最新文章

  1. Cisco asa 5510升级IOS和ASDM
  2. centos7 安装mysql 解决:Failed to restart mysqld.service: Unit not found
  3. 八、数据库服务连接存储(MPIO) 中
  4. 在NamedParameterJdbcTemplate中使用like查询
  5. 微软在Skype推出LGBT骄傲月表情与贴纸
  6. 解决XML中报“cvc-complex-type.2.4.a: Invalid content was found starting with element ”错误
  7. JVM解惑:消失的异常堆栈,log中打印异常堆栈为空
  8. 开源开放 | 细粒度可循证医学文档知识融合表示和推理(CCKS2021)
  9. 深入浅出FlatBuffers原理
  10. 常见RPM,YUM,DNF指令
  11. windows连接远程服务器报错‘SSH‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件 解决方案
  12. 下十页分页php,织梦二次开发实现栏目分页前十页后十页功能
  13. [南阳OJ-No.33]蛇形填数|在n*n方陈里填入1,2,...,n*n,要求填成蛇形。
  14. 2019智能网联汽车技术大会 | 感知+计算——解决智能网联汽车感知困境的必然趋势...
  15. MATLAB的MCC命令
  16. 闹闹天宫一直显示服务器错误,闹闹天宫常见问题FAQ
  17. android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
  18. Java 密码学相关知识
  19. 我总是那么傻,爱的那么真,最后伤了自己:情感日志
  20. requests-bs4路线爬取中华英才网并分析热门职位及其薪资

热门文章

  1. 2023中央财经大学MTI英语翻译硕士专业考研成功经验分享
  2. MyEclipse 快捷键大全(@Hcy)
  3. DC-DC,看这篇文章就够了
  4. python初中数学建模培训_中学生数学建模训练营VIP班
  5. android高德地图api驾车路线规划,驾车路径规划-调起高德地图-示例中心-JS API 示例 | 高德地图API...
  6. 基于Python的超市零售数据分析
  7. [C++]decltype类型指示符
  8. 中国所有省、直辖市、自治区及其简称
  9. matlab park clark,[转载]park,clark和ipark浅析
  10. mql4 c语言,MQL4基础:运算符和表达式 -