随笔分类 -  剑指offer

1
摘要:题目描述 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是 阅读全文
posted @ 2020-02-14 22:55 NeoZy 阅读(544) 评论(0) 推荐(0)
摘要:题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4] 阅读全文
posted @ 2020-02-14 20:01 NeoZy 阅读(238) 评论(0) 推荐(0)
摘要:题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 解答: 阅读全文
posted @ 2020-02-14 15:15 NeoZy 阅读(134) 评论(0) 推荐(0)
摘要:题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 解: 由于二叉搜索树的中序遍历是升序,所以在中序基础上添加计数器即可。 1 class Solution { 2 public: 3 TreeNode* Kth 阅读全文
posted @ 2020-02-14 03:02 NeoZy 阅读(125) 评论(0) 推荐(0)
摘要:题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 方法1: 正常层次遍历,利用普通队列。逢奇数行(从0算起)就把该层结果逆序。 1 class Solution { 2 public: 3 ve 阅读全文
posted @ 2020-02-14 02:20 NeoZy 阅读(128) 评论(0) 推荐(0)
摘要:题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 写法1: 当前遍历到cur节点,如果cur->next和cur->next->next的值相同,说明找到了重复节点, 阅读全文
posted @ 2020-02-13 20:43 NeoZy 阅读(198) 评论(0) 推荐(0)
摘要:1 class Solution { 2 public: 4 bool isNumeric(char* string) 5 { 6 std::string str=string; 7 if(str.empty()){return true;} 8 bool if_e=false,if_dian=fa 阅读全文
posted @ 2020-02-13 01:27 NeoZy 阅读(101) 评论(0) 推荐(0)
摘要:这题一年前就做过,当时刚开始刷leetcode,提交了几十次过不去,就放那没管了。今天剑指offer又遇到这题,终于做出来了,用的dp。 1 class Solution { 2 public: 3 bool isMatch(string s, string p) { 4 int s_len=s.s 阅读全文
posted @ 2020-02-11 02:02 NeoZy 阅读(164) 评论(0) 推荐(0)
摘要:我的常规方法: 由于数组长度n,所有数据的大小都在0到n-1之间,所以考虑把每一位上的数字都放到应该呆的位置。如果nums[i]!=i并且nums[i]该呆的位置(nums[nums[i]])已经等于nums[i]了,说明出现了重复数字。 1 class Solution { 2 public: 3 阅读全文
posted @ 2020-02-11 01:02 NeoZy 阅读(146) 评论(0) 推荐(0)
摘要:用位运算模拟加法,num1+num2的加法结果可以分为两个部分,一部分为二进制位加法产生了进位的结果,另一部分是二进制位加法没产生进位的结果。 比如3+5,二进制011+101,产生进位的结果为最后一位1+1,进到倒数第二位,结果为010。没产生进位的是第1位0+1和第二位1+0,结果110。 1 阅读全文
posted @ 2020-02-11 00:05 NeoZy 阅读(95) 评论(0) 推荐(0)
摘要:题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 方法1:用set记录出现过的数字 class Solution { public: void FindNumsAppearOnce(vector<int> data,int* num1,int * 阅读全文
posted @ 2020-02-09 21:08 NeoZy 阅读(164) 评论(0) 推荐(0)
摘要:这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点。 方法1:对于每一个list1的节点,遍历list2查找有无相同节点,O(MN) 方法2:用两个栈分别存储两个链表的所有节点,然后比较二者栈顶(如果有公 阅读全文
posted @ 2020-02-09 03:55 NeoZy 阅读(137) 评论(0) 推荐(0)
摘要:leetcode上也见过一样的题,当时不会做 看了一下解法是纯数学解法就没看,结果剑指offer上也出现了这道题,那还是认真看下吧 对于数字abcde,如果第一位是1,比如12345,即计算f(12345)。 那么首位为1对结果的增益一共是10000到12345一共2346个。 另外首位为1的数字, 阅读全文
posted @ 2020-02-08 17:14 NeoZy 阅读(208) 评论(0) 推荐(0)
摘要:O(N)划分法,注意这个方法会改变原数据(函数参数是引用的情况下)!当然也可以再定义一个新容器对其划分 要求前k小的数,只要执行快排划分,每次划分都会把数据分成大小两拨。直到某一次划分的中心点正好在k处,则左侧0~k-1的数字正好就是所求。 class Solution { public: vect 阅读全文
posted @ 2020-02-08 14:51 NeoZy 阅读(125) 评论(0) 推荐(0)
摘要:我惯用的dfs模板直接拿来套 class Solution { public: vector<string> Permutation(string str) { if(str.empty()){return{};} int n=str.size(); vector<string> res; vect 阅读全文
posted @ 2020-02-07 22:50 NeoZy 阅读(229) 评论(0) 推荐(0)
摘要:中序递归,一个pre节点记录前一个节点 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } 阅读全文
posted @ 2020-02-07 15:36 NeoZy 阅读(168) 评论(0) 推荐(0)
摘要:时间O(N),空间O(N) /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { 阅读全文
posted @ 2020-02-07 01:42 NeoZy 阅读(162) 评论(0) 推荐(0)
摘要:一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt=0; void push(int value) { vec.push_back(value); if(min_ 阅读全文
posted @ 2020-02-06 16:32 NeoZy 阅读(195) 评论(0) 推荐(0)
摘要:记录一下书上的写法。很整洁,每个函数的功能都显而易见。自己开始写的一堆if else语句像是一坨屎。另外注释的地方短路效应也要注意一下。总之这题还挺考察代码素质的(我这种就不存在什么素质。。乱糟糟一团) #include<iostream> using namespace std; bool is_ 阅读全文
posted @ 2019-11-26 23:15 NeoZy 阅读(123) 评论(0) 推荐(0)
摘要:void print_n_number(int n){ if(n<=0){ cout<<"fuckyou"; return; } string s="1"; while(s.size()<=n){ while(s.back()<='9'){ cout<<s<<endl; s.back()+=1; } 阅读全文
posted @ 2019-11-14 01:11 NeoZy 阅读(105) 评论(0) 推荐(0)

1