自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode 329 Longest Increasing Path in a Matrix解题报告

首先很开心,在没有看任何解答的情况下解出了这道题!方法一:从每一个点出发,简单的DFS,单纯用mem来记录访问过的位置,当mem[i][j]=1时代表访问过数组,则以后不再访问。结果是超时了。 int longestIncreasingPath(vector<vector<int>>& matrix) { if(matrix.empty())retu...

2018-04-10 12:22:01 249

原创 【leetcode】542. 01 Matrix的解法总结

【方法一】 「心路历程」 解这道题的第一印象是bfs,因为类似寻找最短路径。我的第一种解法在不参考任何人的算法的情况下写的,真的是艰辛万苦的打补丁,错了好多testcase,好不容易改出来,尽管写的比较乱,但是运行效率出乎我的意料高。首先将1的地方全赋值为-1且存入队列q。 第一个while用于从前到尾的的先将所有-1的地方根据四周大致赋一遍值,将值大于等于3的记录在栈c中。

2017-09-12 21:47:22 573

原创 【leetcode】102 103 637 典型BFS

【102.Binary Tree Level Order Traversal】 「思路」 运用广度优先算法(BFS)的思想。用一个队列q,在处理并pop上一层的数据的同时push近其下一层左右子树,pop完上一层时,下一层的数据也刚好完全push入队列,以此类推完成操作。 「运行结果」 「代码」class Solution {public: vector<vector<in

2017-09-08 03:28:06 244

原创 【leetcode】116. Populating Next Right Pointers in Each Node

「思路」 因为是完美的二叉树所以问题的难度降低了不少。如果一个root有左右子节点则左next指向右。如果root有next节点,则root的右next指向root的next的左,否则指向NULL。 「运行结果」 其中version 2 仅仅是把两个函数合并成了一个函数,效率上提高了3ms。 - version1class Solution {public:void connect

2017-09-03 07:49:42 177

原创 【leetcode】129. Sum Root to Leaf Numbers

「思路」 用a,b分别记录右子树和左子树当前的值,在root没有左右子树时,将最终取得的a或b的值加给ans。当仅有右子树时,a在加上当前root的值和从上一层传递来的数据(由于不知道上一层是从a还是b传来的,所以a,b都要加上),再*10。指针向右子树继续向下传递(注意,仅从右子树向下传递时,b要清0,以防重复计算)。同理的仅有左子树的情况。当左右子树都有时,a b都要重新用以上方法计算。 「

2017-09-01 02:35:58 188

原创 【leetcode】124.Binary Tree Maximum Path Sum

「思路」 将问题转化为两个部分,第一部分为maxsum函数,实现以不同节点作为根节点的最大结果,并不断更新最大结果。第二部分为downsum函数,由于maxsum函数确定了根节点,所以downsum负责以固定点为根节点向下传递时路径最大的和。 但是这种办法导致超时。class Solution {public: int ans; int maxPathSum(TreeNode*

2017-08-31 07:53:38 255

原创 【leetcode】104,110,111总结

【111. Minimum Depth of Binary Tree】 「思路」 利用深度优先算法,预先设定一个比较大的ans值,不断更新ans的最小值,最终找到最短路径。 「代码」class Solution {public: int ans=100000000; int minDepth(TreeNode* root) { if(!root)retur

2017-08-30 00:19:57 306

原创 【leetcode】563. Binary Tree Tilt总结

「思路」 设定两个函数,tilt,sum。tilt负责收集左右的和,并相减,并将所有相减的结果想加。sum负责纵向的相加,算出左右字树数字的和。分类按照有无左右子数分类。 「运行结果」 class Solution {public: int findTilt(TreeNode* root) { if(!root)return 0; return til

2017-08-27 22:43:08 246

原创 Path Sum,Path Sum II,Path Sum III总结

【Path Sum I】 「运行结果」 class Solution {public: bool hasPathSum(TreeNode* root, int sum) { if (root == NULL) return false; else if (root->left == NULL && root->right == NULL && root-

2017-08-24 20:37:04 205

原创 【leetcode】454. 4Sum II 总结

【方法一】 「思路」 近似暴力解法,将AB数组中元素依次相加得到数组ab,CD数组中元素依次相加得到数组cd,若ab中的元素加cd中的元素和为0,则结果加1. 「结果」 Time Limit Exceeded 「代码」 int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D)

2017-08-03 15:41:23 367

原创 【leetcode】18.4sum 总结

「问题」 「思路」 同3sum,只是多加了一个循环。 首先将数组排序。通过两个循环遍历整个数组,确定结果的前两个数。用target减去前两个数得到后面两个数的和mid。通过夹击的方法求得后面两个数的和sum,对比sum和mid的大小,如果相等的话则返回结果,如果sum>mid则back指针向前移,如果sum<mid则front指针向后移。最后将ret结果排序去重。 「结果」 Runti

2017-08-03 14:10:43 207

原创 【leetcode】16.3Sum Closest 方法总结

【方法一】 「思路」 先将数组排序,用目标数依次减去nums中的每一个数作为间接目标数mid。对剩下的数组设立两个指针,front和back,从两面夹击使得minus=mid-nums[front]-nums[back]的绝对值最小。minus实际代表与target的差值。minus绝对值越小代表与target越接近。最终用target-minus就得到了我们要的答案。 「结果」 Runti

2017-08-03 13:04:16 254

原创 【leetcode】15.3sum 两种解法总结

【方法一】 「思路」 将结果总体分为3种: 1.包含0 a.包含一个0 b.3个都是0 2.两正一负 3.两负一正 按照零正负将数组分为三组,依次两两组合两正之和来查看有没有绝对值相等的负数,两负数同理。最后将返回的vector去重。(注意:两正一负,两负一正在返回结果时要注意三个数字的顺序,否则会影响去重结果) **「结果」**Runtime: 299 ms

2017-08-03 01:05:02 608

原创 经典排序——基数排序LSD——C语言版

/*基数排序——LSD*//*一共10个桶,从个位开始,将元素按照每一位的数字分配到相应桶中,然后再重新收集,每次收集后,元素之间保持了相对位置(个位小的在前,经过重新分配后,依然保持个位小的在前)最后一次收集后元素将从小到大依次排列*/#include <stdio.h>#define digit 4 //几位数字,随便设置#define bucket_size 10 //每个桶的容量/*

2017-05-10 22:32:03 960

原创 经典排序——桶排序——C语言版

/*桶排序——最多两位数*//*申请和分配每个桶的空间,将数组插入桶中,本程序为每个数除以10,即每个桶内进行个位排序,之后按顺序从每个桶内把数据取出排列到数组内*/#include <stdio.h>#include <stdlib.h>#define bucket_size 15//有多少个桶 15可以最大排到150typedef struct node{ int key;

2017-05-10 15:58:04 1206

原创 经典排序——快速排序——C语言版

/*快速排序*//*选取数组的第一个数作为轴,从末尾的数字开始比较,当比轴小则与轴交换位置,在用轴与开头的数字进行比较,当比轴大则与轴交换位置,最终确定轴的位置。之后从轴的位置将数组分为两个部分,对各个部分重复选轴定轴的操作*/#include <stdio.h>int partition(int s[],int low, int high){ int i,j,temp; te

2017-05-10 15:56:42 220

原创 经典排序——归并排序——C语言版

/*归并排序*//*先将数组从中间逐个拆分,比较拆分后的两组数据,并将其合并,最终合并称为原数组*/#include <stdio.h>int merge(int s[],int low,int mid,int high){ int k[high-low+1]; int i,j,t=0; i=low; j=mid+1; while(i<=mid&&j<=

2017-05-10 15:55:12 246

原创 经典排序——希尔排序——C语言版

#include <stdio.h>#include <string.h>#include <math.h>int shell_sort(int s[],int n){ int i,j,temp,d; float a,b; //int p; b=n; a=b/2; //printf("%f\n",a); for(d=ceil(a);d>=

2017-05-10 15:53:57 376

原创 经典排序——堆排序——C语言版

/*堆排序*//*利用数组实现完全二叉树,通过比较左孩子,右孩子和父亲结点的大小,将最小的与父亲节点交换,从而使得最小的一直向上移动。完成一次后将最末尾的节点值移动到最顶,重复前面操作,每次都使得最小的到顶端,并取出*/#include<stdio.h>int heap_adjust(int s[],int i,int max){ int temp,lchild,rchild,k;

2017-05-10 15:52:34 261

原创 经典排序——冒泡排序——C语言版

/*冒泡排序*//*从前面开始,前后数字比较,将大的交换到后面,则循环一轮下来最大的数字到了最后,以此类推每次循环都将最大的放在最后*//*如果第一遍遍历没有交换则代表数组有序,则跳出循环,用sorted作为标记*/#include <stdio.h>#include <stdlib.h>int bouble_sort(int s[],int n){ int i,j,temp,so

2017-05-10 15:49:15 257

原创 经典排序——插入排序——C语言版

/*插入排序*//*从第一个开始排序,排到第n时,前面的n-1个已经是有序的了,所以n可以比较并插入到前面的有序序列*/#include <stdio.h>#include <string.h>int insert_sort(int s[],int n){ int i,j,temp; for (i=0;i<n;i++) { j=i+1;

2017-05-10 15:18:41 171

空空如也

空空如也

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

TA关注的人

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