offer

剑指offer[c++] 包含min函数的栈

匿名 (未验证) 提交于 2019-12-03 00:37:01
剑指offer[c++] 包含min函数的栈 题目: class Solution { public: void push(int value) { stack1.push(value); if(stack2.empty()) stack2.push(value); else if(stack2.top()>=value) stack2.push(value); } void pop() { if (stack1.top() == stack2.top()) stack2.pop(); stack1.pop(); } int top() { return stack1.top(); } int min() { return stack2.top(); } private: stack<int> stack1; stack<int> stack2; // 辅助找最小值 }; 文章来源: 剑指offer[c++] 包含min函数的栈

Leetcode――638. Shopping Offers

匿名 (未验证) 提交于 2019-12-03 00:29:01
https://leetcode.com/problems/shopping-offers/description/ Example 1: Input: [2,5], [[3,0,5],[1,2,10]], [3,2] Output: 14 Explanation: There are two kinds of items, A and B. Their prices are 2 a n d 2 a n d 5 respectively. In special offer 1, you can pay 5 f o r 3 A a n d 0 B I n s p e c i a l o f f e r 2 , y o u c a n p a y 5 f o r 3 A a n d 0 B I n s p e c i a l o f f e r 2 , y o u c a n p a y 10 for 1A and 2B. You need to buy 3A and 2B, so you may pay 4 for 2A. Example 2: Input: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1] Output: 11 Explanation: The price of A is 2 , a n d 2 , a n d 3 for B, 4 f

剑指offer:4. 重建二叉树

匿名 (未验证) 提交于 2019-12-02 23:32:01
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qinjisheng_11/article/details/89790347 重建二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 想法一: 首先根据根节点a将中序遍历划分为两部分,左边为左子树,右边为右子树 在左子树中根据第一条规则递归,得出左子树 在右子树中根据第一条规则递归,得出右子树 最后合成一棵树 public class Solution { public TreeNode reConstructBinaryTree ( int [ ] pre , int [ ] in ) { if ( pre . length == 0 || in . length == 0 ) { return null ; } TreeNode node = new TreeNode ( pre [ 0 ] ) ; for ( int i = 0 ; i < in . length ; i ++ ) { if ( pre [ 0 ] == in [ i ] ) { node . left =

剑指offer_面试题40,最小的k个数,堆解法和快速选择解法

匿名 (未验证) 提交于 2019-12-02 23:05:13
面试题40,最小的k个数,堆解法和快速选择解法。 照这个思路,可以引入一个结构,使得前k个数总是最大的数在第一个,这样每次遇到一个数值需要和前k个数中排在第一位的那个最大数比较就可以了。 这个结构就是最大堆。 思路一:维护一个maxSize为k的最大堆,用来存放这k个数,遍历数组,如果堆未满,插入堆中。如果堆已满,如果数字比堆的根节点小,则删除堆的根节点,向堆中插入这个数字。 时间复杂度为 O(nlog(k))。如果求最大的k个数,就是使用最小堆了。 思路二:其实我们也可以在n个整数的范围内构建最小堆,然后每次将堆顶的最小值取走,然后调整,再取走堆顶值,取k次,自然就找到了最小的k个数。 这样做的时间复杂度是多少呢?基于n个无序数构建最小堆,时间是O(n),而取走堆顶元素,将堆末元素放到堆顶重新调整的时间复杂度是 O(h),h为堆高度,这里堆高度h总是logn保持不变。 因此时间复杂度是O(n+k logn),这个思路可以再改进:每次重新调整,只需要基于堆顶部k层进行调整,堆末元素被放到堆顶后,最多只需要下调至k层即可,因此调整的时间复杂度成了O(k)。这样做的时间复杂度成了 O(n+k k)。 可以证明O(n+k*k) < O(nlog(k)),但是实际情况下,是否思路二更好呢? 我们别忘了思路二的初始化需要基于整个n个数构建堆,而思路一则不需要。实际情况下,

剑指offer(四):递归题目 字符串字串 字符串全排列 查找输出素数及其因子

匿名 (未验证) 提交于 2019-12-02 22:59:29
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39087263/article/details/84500985 示例:abc的顺序子串:a ab abc | b bc | C (1)i指向初始位置,j指向末位位置,遍历一次abc,输出,将i指针移动,一次输出, (2)递归调用i + 1号位置 如图: void Funstr(char *str,int m,int n) { if(m==n) { cout<<str[m]<<endl; return ; } for(int j =m;j<=n;j++) { for(int i=m;i<=j;i++) cout<<str[i]<<" "; cout<<endl; } Funstr(str,m+1,n); } int main() { char str[] = "abcd"; Funstr(str,0,3); system("pause"); return 0; } 2.递归判断一个数的素数因子 void Prim(int m) { int i =0; for(i =2;i<(m/2+1);i++) { if(m%i==0) { break; } } if(i==(m/2+1)) { cout<<m<<endl; } else { cout<<i<<'*'; Prim(m

剑指offer:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

匿名 (未验证) 提交于 2019-12-02 22:56:40
题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3 分析: 1)0---9之间的数字 代码实现: import java.util.regex.Matcher; import java.util.regex.Pattern; public class Solution { public boolean isNumeric(char[] str) { String ss = String.valueOf(str); // 先判断每个字符是否合法 int len = ss.length(); for(int i=0; i<len; i++){ char c = ss.charAt(i); if(!((c>='0' && c <= '9') || c=='e' || c=='E' || c=='+' || c=='-'|| c=='.')){ return false; } }// // 正负号,E不能在末尾 if(ss.charAt(len-1) == '+' || ss.charAt(len-1) == '-' || ss.charAt(len-1) == 'E' || ss.charAt(len-1) == 'e'){ return

【剑指Offer】链表中倒数第k个结点

匿名 (未验证) 提交于 2019-12-02 22:56:40
题目描述 输入一个链表,输出该链表中倒数第k个结点。 解法 # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def listlen(self, head): p = head length = 0 while p: length += 1 p = p.next return length def FindKthToTail(self, head, k): # write code here length = self.listlen(head) print(length) q = head i = 1 while q: if i + k -1 == length: return q q = q.next i += 1 return None 文章来源: 【剑指Offer】链表中倒数第k个结点

剑指Offer:左旋转字符串Java/Python

匿名 (未验证) 提交于 2019-12-02 22:11:45
1.题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! 2.算法描述 这个感觉没啥好写的,先将K对字符串长取余数。 就是两种方法: 1.s[K+1…length] + s[1…K] = 新字符串 例如: s[K+1…length] = “XYZdef” s[1…K] = “abc” “XYZdef” + “abc”=“XYZdefabc”=新字符串 2.前k个字符串原地逆序,剩下的字符串原地逆序,整体字符串原地逆序。 例如: 前K个原地逆序:“abc”->“cba” 剩下的原地逆序:“XYZdef”->“fedZYX” 整体原地逆序:“cbafedZYX”->“XYZdefabc” 3.代码描述 3.1.Java代码 //方法1 public class Solution { public String LeftRotateString ( String str , int n ) { if ( str == null || str . length () == 0 ) return str ; int len = str .

剑指Offer -连续数组的最大和 - Python

匿名 (未验证) 提交于 2019-12-02 22:11:45
题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) 实现1――根据数据的特征: class Solution : def FindGreatestSumOfSubArray ( self , array ) : # write code here input_invalid = False if array is None or len ( array ) <= 0 : input_invalid = True return 0 cursum = 0 greatsum = array [ 0 ] for i in array : if cursum < 0 : cursum = i else : cursum += i if cursum > greatsum : greatsum = cursum return greatsum 实现2:―― 动态规划 def rec_DP (