草庐IT

每日一题

全部标签

每日一题算法

数字在升序数组中出现的次数描述给定一个长度为n的非降序数组和一个非负数整数k,要求统计k在数组中出现的次数解析排序数组的查找问题首先考虑二分法使用二分法找到左右边界的位置,然后长度一减即可解题思路:排序数组的查找问题首先考虑使用二分法解决,其可将遍历法的线性级别时间复杂度降低至对数级别算法流程:1、初始化:声明i,j双指针分别指向array数组左右两端2、循环二分:设m=(i+j)/2为每次二分的中点("/"代表向下取整除法,因此恒有i≤m1、当array[m]>array[j]时:m一定在左排序数组中,即旋转点x一定在[m+1,j]闭区间内,因此执行i=m+12、当array[m]代码pac

每日算法题之扑克牌顺子

JZ61扑克牌顺子描述现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。有如下规则:1.A为1,J为11,Q为12,K为13,A不能视为142.大、小王为0,0可以看作任意牌3.如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为[0,13]具体做法:将nums数组依次装入set集合,遇到0则返回装下一个元素,出现重复元素则返回false,并在其中记录max,min,最终max-min>=5的都不是顺子;代码packageesay.JZ61扑克牌顺子;importjava.ut

每日算法题之扑克牌顺子

JZ61扑克牌顺子描述现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。有如下规则:1.A为1,J为11,Q为12,K为13,A不能视为142.大、小王为0,0可以看作任意牌3.如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为[0,13]具体做法:将nums数组依次装入set集合,遇到0则返回装下一个元素,出现重复元素则返回false,并在其中记录max,min,最终max-min>=5的都不是顺子;代码packageesay.JZ61扑克牌顺子;importjava.ut

每日算法题之买卖股票的最好时机(一)

买卖股票的最好时机(一)描述假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天2.如果不能获取到任何利润,请返回03.假设买入卖出均无手续费解法一:暴力(常规大循环解决)思路步骤:最显而易见的解法,当然可能并不是最优的解法声明变量ans=0存放最终答案两层for循环,分别找到数组中最大的差值,表示利润最大化比较并更新ans的值返回ans即为答案代码intans=0;for(inti=0;ian

每日算法题之买卖股票的最好时机(一)

买卖股票的最好时机(一)描述假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天2.如果不能获取到任何利润,请返回03.假设买入卖出均无手续费解法一:暴力(常规大循环解决)思路步骤:最显而易见的解法,当然可能并不是最优的解法声明变量ans=0存放最终答案两层for循环,分别找到数组中最大的差值,表示利润最大化比较并更新ans的值返回ans即为答案代码intans=0;for(inti=0;ian

每日算法之不用加减乘除做加法

JZ65不用加减乘除做加法描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。数据范围:两个数都满足-10\len\le1000−10≤n≤1000进阶:空间复杂度O(1)O(1),时间复杂度O(1)O(1)方法一:位运算非递归(推荐使用)思路:由于题目禁止我们使用+,-,*,/运算符,我们需要通过位运算来实现加法。我们需要通过循环迭代两个变量实现,一个变量指代进位,一个变量指代非进位。位运算中两数进行异或运算可以提供两数加和后二进制非进位信息,位运算中的两数进行与运算的结果可以提供两数加和后的二进制进位信息。因此我们将两数与运算的结果进行循环左移一位,并在下一轮

每日算法之不用加减乘除做加法

JZ65不用加减乘除做加法描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。数据范围:两个数都满足-10\len\le1000−10≤n≤1000进阶:空间复杂度O(1)O(1),时间复杂度O(1)O(1)方法一:位运算非递归(推荐使用)思路:由于题目禁止我们使用+,-,*,/运算符,我们需要通过位运算来实现加法。我们需要通过循环迭代两个变量实现,一个变量指代进位,一个变量指代非进位。位运算中两数进行异或运算可以提供两数加和后二进制非进位信息,位运算中的两数进行与运算的结果可以提供两数加和后的二进制进位信息。因此我们将两数与运算的结果进行循环左移一位,并在下一轮

每日算法题之构建乘积数组

JZ66构建乘积数组描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1](除A[i]以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定B[0]=A[1]*A[2]*...*A[n-1],B[n-1]=A[0]*A[1]*...*A[n-2])对于A长度为1的情况,B无意义,故而无法构建,用例中不包括这种情况。方法1思路矩阵中由对角线1将其分成了上三角和下三角。我们先看下三角,如果我们累乘的时候,B[1]是在B[0]的基础上乘了新增的一个A[0],B[2

每日算法题之构建乘积数组

JZ66构建乘积数组描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1](除A[i]以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定B[0]=A[1]*A[2]*...*A[n-1],B[n-1]=A[0]*A[1]*...*A[n-2])对于A长度为1的情况,B无意义,故而无法构建,用例中不包括这种情况。方法1思路矩阵中由对角线1将其分成了上三角和下三角。我们先看下三角,如果我们累乘的时候,B[1]是在B[0]的基础上乘了新增的一个A[0],B[2

每日算法之二叉搜索树的最近公共祖先

JZ68二叉搜索树的最近公共祖先描述给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值3.所有节点的值都是唯一的。4.p、q为不同节点且均存在于给定的二叉搜索树中。数据范围:3思路:非递归,利用二叉搜索树的特点。左子树若p,q都比当前结点的值小,说明最近公共祖先结