自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(113)
  • 收藏
  • 关注

原创 寻找最短迷宫路径/电路布线问题(C++描述)

基本思想和寻找迷宫路径一致 https://mp.csdn.net/postedit/81980772 只是本文中找的是最短的路径,而这一思想也经常用于电路布线。主要方法是深度优先搜索和回溯法。基本的方法是从起始点开始,对其 上,右,下,左四个方向的位置进行距离标定,如果在某一方向上没有障碍物则标定此方向距离起始点的距离,并且将此方向的位置放入队列等待下次从此位置继续开始标定。当然如果有障碍物...

2018-08-23 23:47:56 1304

原创 寻找迷宫路径(C++描述)

一个迷宫可以用如下图描述                                                0表示可以通过,1表示有障碍物。问题是在图中是否可以找到一条路径,从入口(左上顶点)到出口(右下顶点)。主要思想是回溯法和深度优先搜索分析结合代码看会更好首先走一步,然后判断是否到达出口,如果没有到达出口,则找到要移动的相邻的一步,(1)找到了,则保持好当前的...

2018-08-23 15:30:32 2404

原创 求两个字符串的最大匹配

给定两个字符串,例如 abceafg 和bcaedeafgabcea,求出它们两个最大的公有字符串,此题的解为最大长度是5,abcea。代码如下:#include<iostream>#include<string>using namespace std;int main(){ string str1, str2; getline(cin, str1)...

2018-08-21 15:55:38 2726

转载 Pycharm简单使用教程

转 Pycharm简单使用教程 <div class="article-info-box"> <div class="article-bar-top d-flex">

2018-08-20 10:05:35 571

原创 LeetCode213 打家劫舍Ⅱ

 思想和打家劫舍 https://blog.csdn.net/Jeff_Winger/article/details/81779581一致,只不过多算了一次,代码如下:class Solution {public: int rob(vector<int>& nums) { if(nums.size()<=1){ re...

2018-08-17 17:17:24 325

原创 LeetCode198 打家劫舍

主要用到了动态规划的思想,状态转化方程为dp[i]=max(dp[i-1],d[i-2]+nums[i]),代码如下class Solution {public: int rob(vector<int>& nums) { if(nums.size()<=1){ return nums.size()==0?0:nums...

2018-08-17 16:25:49 326

原创 华为2019届校招笔试题

1.给出一个字符串,将重复的字符去除,仅保留第一次出现的字符,且保持去重后的字符在原字符串中的顺序不变。输入数据是一个字符串(不包含空格)输出去重后的字符串输入:12ere2输出:12er#include<iostream>#include<string>#include<algorithm>#include<unorder...

2018-08-17 15:35:02 23339 1

原创 字节跳动2019届校招笔试题

1.世界杯开幕式会在球场C举行,球场C的球迷看台可以容纳M*N个球迷。在球场售票完成后,现官方想统计此次开幕式一共有多少个球队球迷群体,最大的球队球迷群体有多少人。经调研发现,球迷群体在选座时有以下特性:同球队的球迷群体会选择相邻座位,不同球队的球迷群体会选择不相邻的座位(注解:相邻包括前后相邻,左右相邻,斜对角相邻)给定一个M*N的二维球场,0代表该位置没有坐人,1代表该位置已有选择...

2018-08-17 10:56:25 57659 5

原创 LeetCode40 组合Ⅱ

思想和LeetCode39:https://blog.csdn.net/Jeff_Winger/article/details/81589910  一致。都是深度优先搜索,区别是本次组合中在一个子集中不能重复使用数组中的数字。当然在子集中可以使用其他子集的元素,子集之间不能重复。为了防止添加相同集合在结果数组中,我们先对原数组排序。结果数组用set表示,set的类型vector<int&gt...

2018-08-16 19:19:58 222

原创 LeetCode698 划分为k个相等的子集

主要用到了深度优先的搜索思想。先将题意进行转化,k个相等的子集也就是说这k个子集的和为sum,且每个子集的和为sum/k。题目和之前的LeetCode416 分割等和子集的思想一致,也可以转换成背包问题,包的容量为sum/k。不过这次不是只找到一组数来装这一个包,而是找到多个包,这种解法可以找到正确答案,但是代码会很长,不推荐。直接用深度优先的思想做代码量就很简单了。代码如下:class...

2018-08-15 23:35:24 2208

原创 LeetCode416 分割等和子集

       主要的思想来源于0/1背包问题,解决方法是动态规划。我们可以想到,把数组分割成两份,并且和相等,那么每一份的和是总和的一半。那么问题就可以转化为找到一组数,使得他们的和逼近sum/2,最后判断最大的和是否等于sum/2,如果是则说明存在这样的组合,也就是存在子集。其和为sum/2,当然了另一个集合的和也就是sum/2。注意到如果数组的总和为奇数,则可以直接判断不存在这样的子集。所以在...

2018-08-14 22:30:42 959

原创 LeetCode39 组合总和

主要用到了深度优先搜索(DFS)的思想。因此每个可能的组合都是以数组中的每个数字开始的,对于每个数字都要进行深度搜索。深度搜索的条件是,每次到达一个深度,目标值减去深度下降值,如果目标值为0说明到底了。如果目标值大于0则说明还没到底,继续在此点深度搜索。如果目标值小于0,说明下降的太过了,停止,并且返回到上一级,继续以其他深度下降,直到所有的深度值全都遍历,这算完成了以某一个数字开始的搜索。然后继...

2018-08-11 19:16:18 284

原创 LeetCode125 验证回文子串

从字符串两边开始相向验证,遇到不是字母或者数字的字符时跳过直到遇到字母或者数字为止。接下来就和普通的回文子串验证一样了,相等继续,不相等则返回false。代码如下:class Solution {public: bool isPalindrome(string s) { int left=0; int right=s.size()-1; ...

2018-08-11 17:40:27 219

原创 LeetCode874 模拟行走机器人

理解本题的题意很关键,机器人在(0,0)点开始行走,如果(0,0)点有障碍怎么办,这种情况是不管它,开始下一步行走,一旦机器人离开(0,0)点,这个点的障碍物才生效,后面如果回到此点则不能跨过此障碍。也就是说我们需要先走一步,再去判断这一步是否有效,有效则更新坐标,否则原地不动,继续下一次动作。至于右转和左转实际就是改变机器人的朝向,起初机器人向北,右转则朝向东,左转则朝向西。不同的朝向,意味着向...

2018-08-09 21:35:14 1844

原创 LeetCode43 字符串相乘

主要用到了大整数的乘法运算思想,就是逐位相乘,然后进位统计结果。代码如下:class Solution {public: string multiply(string num1, string num2) { if(num1=="0"||num2=="0") { return "0"; } int n1=...

2018-08-08 14:23:47 483

原创 LeetCode94二叉树的中序遍历

(1)普通递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }...

2018-08-07 20:45:22 194

原创 LeetCode63 不同路径Ⅱ

本题的基本思想和LeetCode不同路径62 https://blog.csdn.net/Jeff_Winger/article/details/81484395的思想基本一致,只不过加了一个条件,就是障碍物。其实思想一致,路径还是来自左边和上边的路径数之和,只不过当位置点有障碍时,此点不通路径数为0;当左边方向有障碍物时,左边的路径数就不计了,起始如果左边或者上边有障碍物不仅仅是不能通过这些方向...

2018-08-07 17:28:47 281

原创 LeetCode62 不同路径

本题的主要思路就是动态规划问题。首先找动态规划的递归表达式,假如咱们站在终点看,那机器人来的方向有两个,左边方向和上边方向,也就是到达此位置的路径数目就是这两个方向的数目之和。借助矩阵很容易写出递归表达式,num[i][j]=num[i-1][j]+num[i][j-1]。需要注意的点是当位置在矩阵的最上边的行和最左侧的行时,路径数为1,因为机器人只能往右边和下边走,不能往上或者往左边拐。代码...

2018-08-07 17:17:28 315

原创 败方树(输者树)的建立

给定一个整数数组,要求对数组中的元素构建败方树(数组相邻元素两两比较,从第一个元素开始)。之后修改数组中的元素,要求输出初始构建以及修改后得到的败方树的所有内部结点代表的整数(从左到右从上到下输出) 输入第一行为数组的元素个数n和修改的次数m。第二行为n个整数,即数组的元素。接下来m行代表m次修改操作,每次操作修改数组中的一个元素,每一行包括两个整数,第一个为被修改元素在数组中的标...

2018-08-06 19:21:59 4206

原创 求矩阵中的相邻数

给定一个矩阵,给定一个矩阵中的位置,求矩阵中和此元素相邻且相等的元素数目,所谓相邻是指元素在矩阵中上下左右的四个元素,而且此相邻性是可以传递的,即相邻的相邻也是相邻元素 解决此题的主要思想是递归回溯。在给定位置中向四个方向拓展,记录相等的元素数目,防止重复访问还要对符合要求的元素标记。然后在此元素的四个相邻位置递归此操作。代码如下:#include<iostream>...

2018-08-03 16:26:05 2845

原创 爬楼梯问题

给定楼梯阶数,可以往上走1阶,也可以往上走2阶。试问有多少种方法可以爬完楼梯,并且输出具体的爬梯方案。这里运用递归回溯的方法。代码如下:#include<iostream>using namespace std;void climbStairs(int remainingSteps,int foot,int steps,int* process,int& coun...

2018-08-03 14:21:47 500

原创 leetCode70 爬楼梯

class Solution {public: int climbStairs(int n) { if(n<=2){ return n; } int a=0,b=2,c=1; for(int i=3;i<=n;i++) { a=b+c; /...

2018-08-03 14:06:55 337

原创 在矩阵中找目标值(搜索二维矩阵)

给一个mxn的二维矩阵,行和列上的元素都按值严格递增,没有重复,给定一个目标值,搜索此矩阵找此值,如果找到了返回值在矩阵中的位置,否则返回-1,-1。搜索的方法是先在矩阵对角线上搜索,如果小于左上角第一个元素,则说明矩阵中不存在目标值。如果值等于对角线上的某一元素,则直接返回。如果目标值介于对角线上某两个元素之间,则以这两个元素中大于目标值的元素为基准把矩阵分割成四部分,那么目标值有可能就在此...

2018-08-02 20:03:09 2392

原创 LeetCode74 搜索二维矩阵

class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { //对整个二维数组使用二分法查找 if(matrix.empty()){ return false; } ...

2018-08-02 19:59:39 345

原创 求图中三角形的个数(C++描述)

                                                                                                              首先要给三角形的各个顶点标号,如右图所示。计算三角形的个数,首先要明确三角形的判定方法,怎么判断一个三角形是三角形。我们用边的相交来判定,在图中选择三条边,如果这三条边两两相交...

2018-08-02 14:34:28 5162

原创 C++表达式求值(利用二叉树和栈分别描述)

求例如“(123-5)*6+(9-8)*(5-6)-(10-2*(3-9))”这样的表达式的值。此类问题有两种方法可以解答,第一种是利用二叉树的性质,构建表达树栈。第二种方法是利用两个栈,一个放运算符,一个放数据,通过优先级顺序进行运算操作。1)利用二叉树描述     首先建立表达式树栈,把整个表达式按照优先级分解成各个子表达式,把子表达式分配给二叉树的节点构成表达树栈。表达树栈建好之...

2018-07-31 00:02:51 2675

原创 从有序数组中找出某个数出现的次数

int search(int* array,int size,int target,int flag){ int left=0,right=size-1; int mid=0,last=-1; while(left<=right) { mid=(left+right)/2; if(array[mid]>target){ ...

2018-07-30 11:11:17 3425 2

原创 LeetCode5 最长回文子串

 这里在网上搜集了三种方法(1) 用动态规划的思想来做,isP[i][j]可以表示该字符串是否为回文子串,如果是则长度是j-i+1,否则不记录长度,最后比较找到最大的长度。动态规划方程是isP[i][j]=1(i==j.i+1=j,i+2=j,也就是j-i<=2),isP[i][j]=s[i]==s[j]&&isP[i+1][j-1](j-i>2)。    ...

2018-07-22 19:16:05 234

原创 排序算法总结(C++描述)

排序算法可以分为两类,低级排序算法和高级排序算法低级排序算法:选择排序,冒泡排序,插入排序,希尔排序高级排序算法:堆排序,归并排序,快速排序,排序树,基数排序1 选择排序  1) 在对数组元素遍历的过程中,选择最大的元素放入末端的位置,或者选择最小的元素放入开头,不断压缩循环区间,直到只剩一个元素。放的动作通过交换来执行。   代码如下   函数主体由寻找最大元素的索引和交...

2018-07-08 23:55:44 396

原创 深度优先(DFS)和广度优先(BFS)的实现方法

可以从图的搜索方式引入这两种搜索方法。假设有下面一个图:深度优先的搜索方式就是从一个顶点v出发,选择邻接于v的尚未达到的顶点u,如果这样的u不存在,则搜索终止。如果u存在,那么从u又开始一个新的DFS,也就是递归。例如在上图的搜索中第一回递归到达的路径是1->2->5->8广度优先的搜索方式就是从一个顶点v出发,先搜索所有邻接于顶点v的顶点集合,这算一回搜索,第二回搜索以邻接于顶...

2018-07-04 17:15:47 5862 1

原创 LeetCode39-组合总和

主要用到了深度优先搜索(DFS)的思想,需要注意的是在搜索的过程中对已经达到的点不做标记,因为我们的题目中允许数字重复。从当前节点开始DFS(包含当前节点)。代码如下:执行用时12msclass Solution {public: vector<vector<int>> combinationSum(vector<int>& candidate...

2018-07-04 11:50:40 293

原创 三天打鱼两天晒网问题

假如渔夫在2000年1月1日在打鱼,请问2018年7月3日渔夫在干嘛?代码如下:int workThreeRestTwo(int year, int month, int day){//假设从2000年1月1日开始计算总共有多少天 int sum = 0; int Nums[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; for (int ...

2018-07-03 23:28:46 779

原创 打印一年中所有的星期三

假如要打印2018年所有的星期三,已知2018年的1月3号是新年的第一个星期三。    要知道润年是365天,也就是二月的最后一天是29号,平年是365天,二月的最后一天是28号。1,3,5,7,8,10,12月有31天,其余月是30天。我们可以用一个数组来表示每个月的天数。程序代码如下void printWednesday(){//2018年1月3号是星期三 int Nums[...

2018-07-03 23:19:46 466

原创 将二进制数倒数第M位的前N位取反

按位取反问题,首先想到的就是与1进行异或操作,因为0与1异或的结果是1,1与1异或的结果是0,其结果相当于取反。需要四步以M=2,N=4为例1)将1左移N位(00000001=>000100000)2)将步骤1)得到的数减1(00010000=>00001111)3)将步骤2)得到的数左移M位(00001111=>00111100)4)将步骤3)得到的数与原数字进行异或int g...

2018-06-23 17:44:00 897

原创 计算二进制中1的个数

编写一段代码,统计变量num中二进制数中1的个数我们的方法是逐位判断,具体方法是当前位与1做位与操作,而其他位与0做位于操作,如果结果不为0,则说明当前位是1,计数,否则当前位是0,不计数。将num每次右移一位,再与1做案位于操作。方法一int getNum(int num){     int count;      for(count=0;num!=0;num=num>>1)    ...

2018-06-23 15:37:48 387

原创 运用非递归方法在数组中找出最大值和最小值

经典程序拿来分享。把数组元素看作二叉树的叶子,两两比较,把较小的和较大的分别记录。当数组长度为n,n为偶数,比较次数为3*(n/2-1),n为奇数,比较次数为3*(n-1)/2。可以证明这种非递归算法的比较次数最少。原理如下图所示,实际上运用非递归的方法实现递归。代码如下:template<typename T>{}...

2018-06-19 21:06:15 2389

原创 LeetCode4-两个排序数组的中位数

    对于单个数组的中位数很好求,如果个数是奇数则中位数为array[n/2],个数是偶数则中位数为(array[n/2]+array[n/2-1])/2。对于两个数组的中位数实际就是合并后数组的中位数,但是题目要求复杂度为O(log(m+n)),因此先合并再求中位数的方法放弃。可以从两数组的元素大小顺序入手,奇数数组是左中位数和右中位数和的一半,偶数数组的中位数就是右中位数(第n/2+1个数)...

2018-06-18 14:34:10 332

原创 LeetCode3-无重复字符的最长子串

      直接可以想到的方法就是,以每个字符为开头寻找不重复的子串,记录下该子串的长度,最后返回这些子串中最长的子串,这种方法虽然可以解决问题,但是很暴力,复杂度为O(n^3)。     处理无重复字符的问题,想到可以用map来解决,选择unordered_map<字符,序号>。把没有重复的字符添加到map中,如果出现了重复字符,则说明子串的区间肯定在map中那个重复字符之后开始,不...

2018-06-17 16:16:34 238

原创 LeetCode2-两数相加

刚看到题目,我首先想到的是转换成十进制数相加,试了一下当链表长度很大时不仅耗时很长,还很容易出错。因此要转变思路。我们在草稿纸上计算两个数之和时都要逐位相加的,注意到相同的位相加结果要么是10以内的数,要么是10-20内的数,超过10的要向高位进1。因此可以想到先把所有的同位的两个数相加,保存在链表里,然后遍历链表节点,如果节点的值大于等于10,则它的next位(高位)就要加1,然后把该节点的值减...

2018-06-16 21:08:15 217

原创 LeetCode1-两数之和

如果是有序数组,查找两数之和可以从通过定义两个迭代器从两边进行,这样快一点。但是题目没有说明是有序数组,因此只能逐个比较。题目要求结果不能重复,自然想到了map来处理数据,由于用不到map的有序特性,因此为了追求速度选择unordered_map。将已经遍历的结果插入到unordered_map,在下一个数到达时从unordered_map中寻找满足要求的数,如果存在则返回,否则将此数加入unor...

2018-06-16 20:28:44 252

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除