left函数

lectcode-搜索旋转排序数组Ⅱ

心已入冬 提交于 2020-01-19 22:20:20
要求 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 示例 示例 1: 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 示例 2: 输入: nums = [2,5,6,0,0,1,2], target = 3 输出: false 代码 二分查找法 bool search(vector<int>& nums, int target) { int n = nums.size(); int left = 0,right = n-1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { return true; } if (nums[left] == nums[mid]) { left++; continue; } //前半部分有序 if (nums[left] < nums[mid]) { //target在前半部分 if (nums[mid] > target && nums[left] <= target) {

二分法

最后都变了- 提交于 2020-01-19 18:50:43
1. 二分查找法代码实现: 1 // 二分查找法 2 // A[]为严格递增序列,left为二分下界,x为欲查询的数 3 // 二分区间为左闭右闭的[left, right], 传入的初值为[0, n-1] 4 int binarySearch(int A[], int left, int right, int x){ 5 int mid; 6 while (left <= right){ 7 mid = (left + right) / 2; // mid = left + (right - left) / 2; 8 if (A[mid] == x){ 9 return mid; 10 } 11 else if (A[mid] > x){ 12 right = mid - 1; 13 } 14 else if (A[mid] < x){ 15 left = mid + 1; 16 } 17 } 18 19 return -1; 20 } 2. 二分法求序列中第一个大于等于x的元素的位置L 1 // 求序列中第一个大于等于x的元素的位置L 2 // 二分上下界为左闭右闭的[left, right], 传入的初值为[0, n] 3 int lower_bound(int A[], int left, int right, int x){ 4 int mid; 5 while

FM与FFM算法

五迷三道 提交于 2020-01-14 04:23:21
FM算法全称叫因子分解机( Factorization Machines ),而FFM( Field-aware Factorization Machines )算法是FM算法的特例,这两个算法通常解决稀疏数据下的特征组合问题。 1. FM 算法 FM算法的模型是多项式模型,模型的表达式如下: \[y(\boldsymbol{x}) = {w_0} + \sum\limits_{i = 1}^n {{w_i}{x_i}} + \sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n {{w_{ij}}{x_i}{x_j}} } \] 上式中, x 表示样本向量, x i 表示样本的第 i 个特征值, w 0 、 w i 和 w ij 是模型参数。由于在数据稀疏普遍存在的应用场景中,二项式系数 w ij 是很难训练的,因此将二项式系数 w ij 拆分为两个特征隐向量的点积,故FM算法的模型公式为: \[y(\boldsymbol{x}) = {w_0} + \sum\limits_{i = 1}^n {{w_i}{x_i}} + \sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n { < {\boldsymbol{v}_i},{\boldsymbol{v}_j} > {x_i

字符串的调整与替换

十年热恋 提交于 2020-01-11 23:27:34
题目 给定一个字符类型的数组chars,chars右半区全是空字符,左半区不含空字符。现在想将左半区所有空格替换为’%20’,假设右半区足够大,请完成替换函数。 如左半区’a_b___c’ -> ‘a%20b%20%20%20c’ 思路 算出替换后的最右边位置,从右往左替换。 实现 def replace ( s ) : chars = list ( s ) n = chars . count ( ' ' ) chars += [ None ] * n * 2 right = len ( chars ) - 1 left = len ( s ) - 1 while left >= 0 : if chars [ left ] == ' ' : chars [ right - 2 ] , chars [ right - 1 ] , chars [ right ] = '%' , '2' , '0' right -= 3 else : chars [ right ] = chars [ left ] right -= 1 left -= 1 return '' . join ( chars ) 测试 def test_replace ( ) : for _ in range ( 100 ) : size = random . randint ( 0 , 36 ) chars =

LG5900 无标号无根树计数

≯℡__Kan透↙ 提交于 2020-01-10 21:58:57
有依赖的辅助多项式分治卷积 \[ g_n=\bigoplus_{i=1}^nf_i\\ f_n=\sum_{i=1}^{n-1}f_ig_{n-i} \] 已知 \(f_0=g_0=0,f_1=1\) ,求 \(f_2\sim f_n\) 。对 \(998244353\) 取模。 \(n \leq 10^5\) 。 题解 这类问题的特点: 只有 \(f_1\sim f_n\) 都求出后, \(g_n\) 才能被算出。 卷积的时候不需要 \(g_n\) 。 普通的分治卷积策略是: \[ (f_l\sim f_{mid})\times (g_1\sim g_{r-l}) \rightarrow (f_{mid+1}\sim f_r) \] 在这个问题中,当 \(l=1\) 的时候, \(g_{r-l}\) 未被算出。所以不能这样卷积。 特殊的分治卷积策略是: \(l=1\) 时, \[ (f_l\sim f_{mid})\times (g_l\sim g_{mid})\rightarrow (f_{mid+1}\sim f_r)\\ \] 这样计算的话只有 \(f_{mid+1}\) 的结果是准确的。其余的不仅没有考虑 \(f_{mid+1}\sim f_{i-1}\) 对 \(f_{i}\) 的贡献,还没有考虑 \(g_{mid+1}\sim g_{i-1}\) 对它的贡献。 \(l

LeetCode All in One 题目讲解汇总(持续更新中...)

匆匆过客 提交于 2020-01-08 00:45:32
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. For example, "A man, a plan, a canal: Panama" is a palindrome. "race a car" is not a palindrome. Note: Have you consider that the string might be empty? This is a good question to ask during an interview. For the purpose of this problem, we define empty string as valid palindrome. 验证回文字符串是比较常见的问题,所谓回文,就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。但是这里,加入了空格和非字母数字的字符,增加了些难度,但其实原理还是很简单:只需要建立两个指针,left和right, 分别从字符的开头和结尾处开始遍历整个字符串,如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写

UOJ335 生成树计数

无人久伴 提交于 2020-01-07 21:35:14
多项式变量添系数求和 给一个 \(t\) 次多项式 \(P\) 和 \(n\) 个数 \(a_1\sim a_n\) ,求 \(\sum_{i=1}^n P(a_ix)\) 。 题解 若 \(P=\sum_{k=0}^t p_kx^k\) 那么 \[ \sum_{i=1}^n P(a_ix)=\sum_{k=0}^t p_k\sum_{i=1}^n a_i^kx^k \] 先求 \(A\) 的 \(0\sim t\) 次等指数幂和 \(s_A(x)=\sum_{k=0}^\infty x^k \sum_{i=1}^na_i^k\) ,然后与 \(P\) 的系数对位相乘即可。 等指数幂和用 \[ s_A(x)=\sum_{i=1}^n\frac{1}{1-a_ix}=\frac{\sum_{i=1}^n\prod_{j\ne i}(1-a_jx)}{\prod_{i=1}^n(1-a_ix)} \] 求出,时间复杂度 \(O(n\log^2n+t\log t)\) 。 考虑 \(\sum_{i=1}^n\prod_{j\ne i}(1-a_jx)\) 与 \(\prod_{i=1}^n(1-a_ix)\) 的关系。可以发现后者任意 \(i\) 次项在前者中恰好被算了 \(n-i\) 次。所以用分治NTT求出后者后简单处理即可得到求前者。 多项式变量添系数求积 给一个 \(t\)

java数据结构之排序

不想你离开。 提交于 2020-01-03 05:05:04
写在前面的话:本篇文章是我自己阅读程杰老师的大话数据结构之后自己所做的总结,网上有很多关于排序的详细介绍,我推荐 伍迷家园 所写的文章,介绍的非常详细。 排序是我们在程序中经常要用到的一种算法,好的排序可以极大的提高我们的工作效率,本篇主要介绍几种常见的排序算法; (简单说明: 下面的java程序是用来排序的,其中sum为排序数组,sum[0]不进行排序,只作为哨兵或者临时变量) 1、冒泡排序: 冒泡排序是一种交换排序,其的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 1 //冒泡排序2 最正宗的冒泡排序,i每循环一次,最小的数就像气泡一样慢慢浮到水面上 2 public static void BubbleSort_2(int[] num){ 3 for(int i = 1; i < num.length; i++){ 4 for(int j = num.length-1; j > i; j--){ 5 if(num[j-1] > num[j]){ 6 Swap(num,j-1,j); //交换函数 交换num[j-1]和num[j]的值 7 } 8 } 9 } 10 } 2、选择排序: 简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n

leetcode-二叉树的最近公共祖先

安稳与你 提交于 2019-12-29 20:20:28
class Solution { private TreeNode ans; public Solution() { // Variable to store LCA node. this.ans = null; } private boolean recurseTree(TreeNode currentNode, TreeNode p, TreeNode q) { // If reached the end of a branch, return false. if (currentNode == null) { return false; } // Left Recursion. If left recursion returns true, set left = 1 else 0 int left = this.recurseTree(currentNode.left, p, q) ? 1 : 0; // Right Recursion int right = this.recurseTree(currentNode.right, p, q) ? 1 : 0; // If the current node is one of p or q int mid = (currentNode == p || currentNode == q) ? 1 : 0; // If any

7-16 找第k小的数

好久不见. 提交于 2019-12-27 01:53:42
设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数。 提示:函数int partition(int a[],int left,int right)的功能是根据a[left]~a[right]中的某个元素x(如a[left])对a[left]~a[right]进行划分,划分后的x所在位置的左段全小于等于x,右段全大于等于x,同时利用x所在的位置还可以计算出x是这批数据按升非降序排列的第几个数。因此可以编制int find(int a[],int left,int right,int k)函数,通过调用partition函数获得划分点,判断划分点是否第k小,若不是,递归调用find函数继续在左段或右段查找。 输入格式: 输入有两行: 第一行是n和k,0<k<=n<=10000 第二行是n个整数 输出格式: 输出第k小的数 输入样例: 在这里给出一组输入。例如: 10 4 2 8 9 0 1 3 6 7 8 2 输出样例: 在这里给出相应的输出。例如: 2code【C++】 #include<iostream> using namespace std; int partition(int a[],int left, int right){ int i = left, j = right + 1; int x = a[left]; while