left函数

POJ1845(约数之和)

流过昼夜 提交于 2019-11-28 14:55:09
自闭的人的题解 POJ1845 约数之和 题目描述: 给你两个整数A、B,让你求出a^b中所有的约数的和膜上9901的值。 输入 : 两个正整数A,B 输出 : 一个正整数表示答案 样例: IN :2 3 OUT : 15 这道题,我一开始其实是只有暴力的思路的。 但是,又重新去思考一下,因为求的是所有约数的和,所以我们就可以将A分解质因数 \[ A=p_{1}^{c_{1}} * p_{2}^{c_{2}} * p_{3}^{c_{3}} * \ldots * p_{n}^{c n_{+1}} \] 又因为要^B,所以我们最后得到的式子就是这个: \[ \mathrm{A}=p_{1}^{B * c_{1}} * p_{2}^{B * c_{2}} * p_{3}^{B * c_{3}} * \ldots * p_{n}^{B * c_{n}} \] 所以A^B的约数为就是: \[ \begin{array}{c}{\left\{p_{1}^{k_{1}} * p_{2}^{k_{2}} * \ldots * p_{n}^{k_{n}}\right\}} \\ {0 \leq k_{i} \leq B * c_{i}(1 \leq i \leq n)}\end{array} \] 再将中间的约数拆开来,得到: \[ \left(1+p_{1}+p_{1}^{2}+p_{1}^{3

镜像二叉树

空扰寡人 提交于 2019-11-28 01:45:41
1 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: void Mirror(TreeNode *pRoot) { //一个函数就够 if(pRoot==nullptr) return; if(pRoot->left==nullptr&&pRoot->right==nullptr )//左右都是空节点以及到头了 return; TreeNode *temp=pRoot->left; pRoot->left= pRoot->right; pRoot->right=temp; if(pRoot->left!=nullptr) Mirror(pRoot->left); if(pRoot->right!=nullptr) Mirror(pRoot->right); } }; 来源: https://www.cnblogs.com/cgy1012/p/11386400.html

构造数组的MaxTree

南楼画角 提交于 2019-11-27 14:40:08
【说明】:   本文是左程云老师所著的《程序员面试代码指南》第一章中“ 构造数组的MaxTree ”这一题目的C++复现。   本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。   感谢左程云老师的支持。 【题目】:   定义二叉树节点如下: class Node { public: Node(int data) { value = data; left = NULL; right = NULL; } public: int value; Node *left; Node *right; }; View Code   一个数组的 MaxTree 定义如下:   数组必须没有重复元素;   MaxTree 是一棵二叉树,数组的每一个值对应一个二叉树节点;   包括 MaxTree 树在内且在其中一的每一棵子树上,值最大的节点都是树的头。   给定一个没有重复元素的数组 arr,写出生成这个数组的 MaxTree 的函数,要求如果数组长度为 N,则时间复杂度为 O(N),额外空间复杂度为 O(N)。 【思路】:   利用栈找到每个数左右两边第一个比它大的数,并且用hash_map保存。(估计这样说大家都不明白,大家可以看原书,或者分析代码喽) 【编译环境】:   CentOS6.7(x86_64)   gcc 4.4.7 【实现】:  

LeetCode167-两数之和II-输入有序数组

六眼飞鱼酱① 提交于 2019-11-27 10:20:40
【题目】 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 【思路】 利用有序数组的特性,使用双指针方法。 初始化两个指针分别指向数组第一个和最后一个元素,比较两者之和与目标值的大小, (1)大于目标值,右指针--; (2)小于目标值,左指针++; (3)等于目标值,返回。 【C++代码】 class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { vector<int> b

递增整数序列的二分详解

点点圈 提交于 2019-11-27 09:23:41
二分搜索是一种时间复杂为 log 2 n 的算法,可以用于单调函数求根和单调序列查询的有效算法,即使数列长度高达 10^9 也只需二分 31 次,查询速度接近常数,同时二分思想是一种很基础很重要的思想希望同学们都能掌握; 单调数列 ( 单调递增 ) 通用二分模板 简洁版 完全版 当 start_index =0 , end_index=len-1 时,功能和简洁版一样; 1. 为啥不能写下面这句 if ( mid==n ) return mid 因为有时候会有 这样的一种数列 1 2 2 2 2 3 这个是非严格单调序列,如果叫你寻找 2 第一次出现的位置显然会出现错误 所以上面那个写法是不行的; 2. 为啥不写 left=mid+1 和 right=mid-1 因为有些情况下会不能用 比如在数列 a []={0 1 3 4,5} 找大于 2 的第一个位置 当你 right=4 , left=0; 则 mid=2 ; A[mid]>2 所以 若 r=mid-1=1 你就错过去了,除非你用 if 判断一下,但那样就太冗长难看了; 3. 为啥不能写 w hile(left ! =right) 因为上面的原因我们没用 left=mid+1 和 right=mid-1 而是 left=mid,right=mid 若 a[]={0,1,3,4}; 则找 2 的位置时会死循环 因为 当

杜教筛

非 Y 不嫁゛ 提交于 2019-11-26 23:48:32
也许更好的阅读体验 作用与使用前提 对一个数论函数 \(f\) ,我们要求 \(f\) 的前 \(n\) 项和 \(S_n\) ,并且要求在比线性复杂度更低的复杂度情况下求出 若有数论函数 \(g,h\) ,满足 \(h=f*g\) 其中 \(*\) 为狄利克雷卷积 并且 \(h\) 的前缀非常好求, \(g\) 的单项非常好求,我们就可以快速的求出 \(f\) 的前缀和 求法 先看 \(f,g,h\) 的关系 \(\begin{aligned}h(n)=\sum_{d|n}f(\frac{n}{d})g(d)\end{aligned}\) 我们把对 \(h\) 求前缀和,则有 \(\begin{aligned}\sum ^{n}_{i=1}h\left( i\right) &=\sum ^{n}_{i=1}f\ast g\left( i\right)\\ &=\sum ^{n}_{i=1}\sum _{dli}f\left( \dfrac {n}{a}\right) g\left( d\right) \\ &=\sum ^{n}_{d=1}g\left( d\right) \sum ^{\frac {n}{d}}_{i=1}f\left( i\right) \\ &=\sum ^{n}_{d=1}g\left( d\right) S_{\frac {n}{d}}\\ \\

通过例子总结树形程序

倾然丶 夕夏残阳落幕 提交于 2019-11-26 23:46:22
一.决策   给定一个集合,和一个随机数字,求这个集合是否存在和为此随机数的组合。例如{1,2,3},target=2,可以找到a[1]为2;target=4,可以找到a[0]+a[2]=4;target=0,则找不到元素累加为0。   按照决策的思想,我们对元素的所有组合是一个0和1的过程。比如在第一个元素开始,我们可以选择加或者不加入等式中,这就有两个分支了:(1)a[0]+....;(2).....。   整个程序运行就如图一样,是一个树形结构。 public boolean isCount(int[] nums,int target){ return decision(nums,0,0,target); } boolean decision(int[] nums,int i,int count,int target){    if(i == nums.length){       return count == target; }else { return decision(nums,i+1,count+nums[i],target) || decision(nums,i+1,count,target); } }   由程序可见,它是深度优先的,而深度优先搜索会有很多计算浪费的情况,这个时候就要涉及到剪枝了,怎么剪枝呢,把不需要计算的情况剔除掉。 boolean

LeetCode_字符串

谁说胖子不能爱 提交于 2019-11-26 20:45:00
344. 反转字符串 344. 反转字符串 题目描述 :编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 代码 : class Solution: def reverseString(self, s: List[str]) -> None: """ Do not return anything, modify s in-place instead. """ if not s:return [] length=len(s) left=0 right=length-1 while left<=right: s[left],s[right]=s[right],s[left] left+=1 right-=1 return s 来源: https://blog.csdn.net/weixin_40848065/article/details/99110922

SQL查找字符

不问归期 提交于 2019-11-26 17:28:23
1、left() LEFT (<character_expression>, <integer_expression>) 返回character_expression 左起 integer_expression 个字符。 例如left(Article_Exp,1) 2.charindex() 返回字符串中某个指定的子串出现的开始位置。 CHARINDEX (<’substring_expression’>, <expression>) 其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。 此函数不能用于TEXT 和IMAGE 数据类型。 例如charindex('2',Article_Exp); 转载于:https://www.cnblogs.com/linlin/archive/2010/10/05/1844470.html 来源: https://blog.csdn.net/weixin_30561177/article/details/98976723

<剑指offer> 第11题

十年热恋 提交于 2019-11-26 16:49:42
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分 思路: 维护两个指针,一个指向第一个数,从前往后遍历,另一个指向最后一个数,从后往前遍历,遇到偶数和奇数分别停下,交换位置,然后继续下一次 (类似于快排的第一步) public class Eleventh { public static int[] sortArray(int[] arr){ if(arr.length < 2){ return arr; } int left = 0; int right = arr.length - 1; while(left < right){ if(arr[left] % 2 == 1 && left < right){ left ++; } if(arr[right] % 2 == 0 && left <right){ right --; } int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } return arr; } public static void main(String[] args){ int[] arr = {1,2,3,4,5,6}; for(int i: sortArray(arr) ){ System.out