![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
yyang_233
这个作者很懒,什么都没留下…
展开
-
数组中数字出现的次数——剑指offer 56-II
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。var singleNumber = function(nums) { var map={}; var arr=[]; for(var i=0;i<nums.length;i++){ if(map[nums[i]]==null){ map[nums[i]]=1; }else{ map[nums[i原创 2020-10-11 15:34:58 · 162 阅读 · 0 评论 -
数组中数字出现的次数——剑指offer 56-I
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。如果我们可以把所有数字分成两组,使得:两个只出现一次的数字在不同的组中;相同的数字会被分到相同的组中。那么对两个组分别进行异或操作,即可得到答案的两个数字。这是解决这个问题的关键。那么如何实现这样的分组呢?var singleNumbers = function(nums) { var tmp = 0; for(var原创 2020-10-11 15:25:25 · 189 阅读 · 0 评论 -
数组中出现次数超过一半的数字——剑指offer 39
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。方法1 hash表统计法var majorityElement = function(nums) { var map={}; var len=Math.floor(nums.length/2); for(var i=0;i<nums.length;i++){ if(map[nums[i]]==null){ map[原创 2020-10-11 10:56:20 · 186 阅读 · 0 评论 -
0~n-1中缺失的数字——剑指offer 53-II
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。方法1var missingNumber = function(nums) { for(var i=0;i<=nums.length;i++){ if(i!=nums[i]) return i; }};方法2 二分法利用二分查找,整体流程是:left 指向 0,rig原创 2020-10-10 20:03:35 · 213 阅读 · 0 评论 -
在排序数组中查找数字 ——剑指offer 53-I
统计一个数字在排序数组中出现的次数。方法1从数组左侧向右遍历,遇到目标数字 target,停止,记录下标 left从数组右侧向左遍历,遇到目标数字 target,停止,记录下标 right如果 right 小于 left,那么说明没出现,返回 0;否则返回 right - left + 1var search = function(nums, target) { var left=0; var right=nums.length-1; if(nums.length==0)原创 2020-10-10 19:31:49 · 120 阅读 · 0 评论 -
顺时针打印矩阵——剑指offer29
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。循环的条件是 top <= bottom && left <= right 。每遍历完一条边,下一条边遍历的起点被“挤占”,所以要更新相应的边界。因为要在循环过程中更新边界,所以可能出现:循环的条件在中途不再满足,即 top > bottom || left > right ,其中一对边界彼此交错了。这代表此时所有项都遍历完了,如果不马上 break,就会重复遍历,造成元素重复地进入结果数组。原创 2020-10-09 16:21:08 · 204 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面——剑指offer21
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。方法1var exchange = function(nums) { var arr1=[]; var arr2=[]; for(var i=0;i<nums.length;i++){ if(nums[i]%2==0){ arr1.push(nums[i]); }else{ ar原创 2020-10-09 11:32:37 · 150 阅读 · 0 评论 -
旋转数组中的最小数字——剑指offer11
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。方法1 暴力关键点:1.正常排序的情况下,最小就是第一个;2.旋转过的,则找出第一个数字小于前一个数字。从下标为0的元素开始遍历;每次进行比较,如果当前元素比相邻的下一元素大,则对应的下一个元素即为最小值;如果遍历到最后一个元素都没有出现过上述情况,则下标为0的元素为最小元素原创 2020-10-08 19:25:55 · 357 阅读 · 0 评论 -
二维数组中的查找——剑指offer04
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。方法1暴力遍历var findNumberIn2DArray = function(matrix, target) { var rowLength=matrix.length; if(rowLength==0) return false; var colLength=matrix[原创 2020-10-08 15:51:45 · 195 阅读 · 0 评论 -
数组中重复的数字——剑指offer03
数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。方法1哈希表的结构是:key-value,key 就是数组中的数字,value=1 代表数字出现过。整体的流程是:遍历数组中的数字,检查是否出现过,如果出现过,那么返回此数字。代码实现如下:var findRepeatNumber = function(nums) { const map原创 2020-10-08 14:53:40 · 119 阅读 · 0 评论 -
C++ 电话号码的字母组合——leetcode(回溯)
首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。回溯算法用于寻找所有的可行解,如果发现一个解不可行,则会舍弃不可行的解..原创 2020-09-13 20:03:03 · 423 阅读 · 1 评论 -
C++ 矩阵中的路径——剑指Offer(回溯)
当前处理的问题是:判断字符串str[0 … length-1]是否在matrix中匹配,显然下一次递归处理的问题是:如果str[0]已经匹配,则判断字符串str[1 … length-1]是否在matrix中匹配。首先考虑dfs()的参数是什么,返回值是什么。// i, j 表示在matrix中的位置,// pos表示当前正在匹配的字符串str的下标// 找到整个字符串str, 则返回true, 否则返回falsebool dfs(int i, int j, int pos, char *s..原创 2020-09-09 18:19:03 · 183 阅读 · 0 评论 -
回溯法
回溯法从根节点出发,按照深度优先遍历解空间树,搜索满足约束条件的解。在搜索至树中任一节点时,先判断该节点对应的部分解是否满足约束条件,是否超出目标函数的界,也就是判断该节点是否包含问题的(最优)解,如果肯定不包含,则跳过对以该节点为根的子树的搜索,即所谓剪枝;否则,进入以该节点为根的子树,继续按照深度优先搜索。回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:使用约束函数,剪去不满足约束条件的路径;使用目标函数,剪去不能得到最优解的路径。问题的关键在于如何.原创 2020-09-09 16:52:08 · 205 阅读 · 0 评论 -
C/C++求字符串长度
C/C++求字符串长度strlen(str)str.length()str.size()sizeof(str)strlen(str)是用于求字符数组的长度,其参数是char*str.length()、str.size()、sizeof(str)是用于求string类对象的成员函数原创 2020-09-09 16:48:56 · 1244 阅读 · 0 评论 -
末尾0的个数——C语言
解题思路计算n的阶乘,n的阶乘:n!=1×2×3×…×n那么我们在计算n的阶乘时,实际上就是把所有小于等于n的正整数分解成质因数,然后再将其乘到一起,那么末尾0的个数实际上就是2* 5的个数,而2的个数明显是很多很多的,所以问题就转化成了5的个数。 而只有5的倍数才有5这个因数,所以,问题就进一步简化为小于等于n的数中有多少个数是5的倍数,当然25的倍数,125的倍数,625还要单独考虑,比如拿25来说,25=5*5 ,里面有两个5,提供两个0.代码实现#include<stdlib.h&g原创 2020-08-21 13:53:11 · 2334 阅读 · 0 评论