随笔分类 - 算法题
摘要:面试题35. 复杂链表的复制 1 class Solution { 2 public: 3 Node* copyRandomList(Node* head) 4 { 5 if (head == NULL) 6 { 7 return head; 8 } 9 Node *cur = head; 10 N
阅读全文
摘要:面试题27. 二叉树的镜像 解题思路:大多数二叉树都可用递归实现。 递归的内部实现就是栈,所以可以用栈代替递归实现。 递归注意结束条件。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5
阅读全文
摘要:面试题55 - I. 二叉树的深度 解题思路:通过层次遍历,将每一层只算一次,进行while循环弹出该层所有数据,在进行下一层入队列。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5
阅读全文
摘要:面试题63. 股票的最大利润 动态规划解析: 1 class Solution { 2 public: 3 int maxProfit(vector<int>& prices) 4 { 5 if (prices.size() < 2) 6 { 7 return 0; 8 } 9 int cout =
阅读全文
摘要:面试题42. 连续子数组的最大和 题目要求: 解题思路: 1. 定义子问题: dp[i] 为下标以 num[i] 结尾的数组字段 元素最大最短和,i表示子段到当前i位置 i; 2. 寻找关系式: 只有一个元素:dp[0] = num[0]; 两个元素:dp[i] 为num[0], num[1], n
阅读全文
摘要:198. 打家劫舍 题目要求: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷
阅读全文
摘要:72. 编辑距离 题目要求: 解题思路: 根据动态规划的步骤: 1. 定义数组元素的含义,这里用到两个字符串,所以应该定义二维数组; 由于我们求的是字符串1转换成字符串2所需要的最少次数:当字符串1的长度为i,字符串2的长度为j,则字符串1转换成字符串2所需次数为dp[i][j]; 2. 找出关系数
阅读全文
摘要:62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 问总共有多少条不同的路径? 解题思路1: 动态规划的三个步骤: 1. 定义数组元
阅读全文
摘要:面试题40. 最小的k个数 问题描述: 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 解题思路: 这题不要直接使用 sort(arr.begin(), arr.end() ) 函数; 时间复杂度:O(n\lo
阅读全文
摘要:解题思路: 开始思路想的是两个数组有序,通过两个数组相互对比,那么把寻找第k小的数转换成选择最小数,找到之后跳过,然后循环k次,这样必须循环k次,而且每次还要对比,时间复杂度太高。 优化之后,解题思路与下面这个很类似。 递归训练1:在两个长度相等的排序数组中找到上中位数 每次寻找时,将两个数组mid
阅读全文
摘要:题目要求: 解题思路: 1. 当数组长度为偶数时,它们各自的中位数下标为:mid1=(n-1)/2; mid2=(n-1)/2; 当arr1[mid1] < arr2[mid2]时,目标中位数一定在arr1[mid1+1,,,,,,n]和 arr2[0,,,,,mid2]之间,不可能在其余区间;因为
阅读全文
摘要:面试题 08.05. 递归乘法 题目要求: 递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。 解题思路: 思路1:直接将乘法分成多个n相加,比较直接暴力; 判断其中较小的数,然后将较大数data相加,一共加n个。 思路2: 1. 巧用位
阅读全文
摘要:题目: 解题思路: 记住递归内部就是一个栈,写两个递归就能实现队列,即将12345,入栈之后出栈还是12345。 这里是第一个递归实现获取栈底元素,然后再使用第二个递归,实现反转。 1 /* 递归函数1: 将栈stack的栈底元素返回并移除 */ 2 static int getAndRemoveL
阅读全文
摘要:题目链接:https://leetcode-cn.com/problems/min-stack-lcci/ 解题思路: 1. 通过新建两个栈,一个是数据栈,另一个是临时栈用于存放栈的最小元素; 2. 这里入栈应该将x直接入stk栈; 3. 临时栈判断是否为空,若空则直接入栈,否则将临时栈的栈顶与当前
阅读全文
摘要:剑指Offer:表示数值的字符串 题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"及”-1E-16"都表示数值,但"12e"、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是
阅读全文
摘要:剑指Offer:合并两个排序的链表 题目要求: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 解题思路: 通过新建一个头节点,并且是动态分配内存,这样就可以根据传入的链表长度而不断增加; 新建一个头指针指向链表头部,不要移动,作为返回使用。 通过对比两个结点的值,从而判
阅读全文
摘要:剑指Offer:链表中倒数第k个节点 题目描述: 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。 解题思路: 因
阅读全文
摘要:剑指Offer:反转链表 题目描述: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 解题思路: 通过遍历链表,将当前链表的指针域直接改变,指向前一个结点。 并且保存当前结点地址,前一个结点地址。 class Solution { public: ListNode* rev
阅读全文
浙公网安备 33010602011771号