自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Leetcode Letter Combinations of a Phone Number

给出手机上的字符按键顺序,求所有可能的按出的字符串。简单dfs搜索,0msconst char* map[] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};void dfs(char* digits, char* pre, char** res, int* returnSize) { if (!digits

2015-05-18 18:51:15 536

原创 Leetcode Intersection of Two Linked Lists

找两个链表中的第一个共同元素。尽量O(n)时间,O(1)空间。32ms简单题struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { if (!headA || !headB) return NULL; int l1 = 0, l2 = 0; stru

2015-05-18 18:21:53 426

原创 Leetcode Pascal's Triangle II

动规求Pascal三角,0ms简单动规int* getRow(int rowIndex, int* returnSize) { int i, j; *returnSize = rowIndex + 1; int* a = calloc(sizeof(int), (rowIndex + 1)); a[0] = 1; for (i = 1 ; i <= ro

2015-05-18 17:51:10 452

原创 Leetcode Balanced Binary Tree

判断一个二叉树是否是高度平衡的。高度平衡的定义是:对每一个节点,其左儿子树与右儿子树的高度差小于等于1。8msint height(struct TreeNode* node) { if (!node) return 0; int l = height(node->left); if (l == -1) return -1; int r = height

2015-05-18 17:08:01 323

原创 Leetcode Maximum Subarray

动规求最大一维连续子数组,f[i] 表示以i结尾的子数组和。4ms#define MAX(a, b) ((a) > (b) ? (a) : (b))int maxSubArray(int* nums, int numsSize) { int* f = malloc(sizeof(int) * numsSize); int i, res = f[0] = nums[0];

2015-05-18 03:47:50 324

原创 Leetcode Merge Sorted Array

合并两个数组,假设第一个数组内有足够的空间。4msvoid merge(int* nums1, int m, int* nums2, int n) { int i, j = 0, p = 0; for (i = m-1 ; i >= 0 ; i--) nums1[i + n] = nums1[i]; i = n; while (i < m + n || j < n) if

2015-05-18 03:18:11 263

原创 Leetcode Restore IP Addresses

给定一个数字字符串,求所有可能的点分十进制ip。显然是dfs,有一些小细节写在了注释里。0ms。#include #include /* @param: char* s 剩下的字符串 char* pre 未完成的转换字符串,未完成时总是以.结尾 char** result 指针数组,需要free释放内存 char* returnSize 指针数组的长度 int

2015-05-17 22:55:52 521

原创 LeetCode Majority Element

这种方法必须最终返回res,而不是判断cnt > n>>1即可返回。因为对于[3, 4, 3]的情况,可能3已经出现了超过一半的次数,但它的领先值(cnt)依然为0。判断cnt > n>>1只是一个小小的优化。而且这种方法判断是否存在一个Majority Element,但是幸亏题目指出一定存在一个Majority Element(这也正是面试的关键所在)。否则还需O(n)时间和空间判断Majority Element的存在。

2015-05-16 11:00:29 354

原创 LeetCode Max Points on a Line

可以用hash对其进行优化(4ms过)。思想是,对每一个点,计算其它节点与他的斜率,放入一个hashtable并计数,最终取hashtalbe中累计最多的一个。注意计算斜率的宏Slope,当两点斜率为无穷大时,我们设斜率为float的最大值,保证了逻辑上的Inf != any other && Inf == Inf,注意这里的等号和不等号是针对与二进制的物理表示的,因为我们在hashtable中,key的相等是依据直接比较二进制物理表示。当两点斜率是0时,我们手动赋值0.0,否则可能出现-0.0物理

2015-05-16 10:16:54 358

原创 LeetCode Linked List Cycle II

找链表中的环,如果有则输出环内第一个元素。经典面试解法是两个指针,7ms过。(不知道那些6ms是怎么办到的,而且还有40%。。。。)证明理解清楚。设环中节点n个,环外节点m个,则循环中遍历了(m + (n - m%n) + m)个节点。第一部分为慢指针到达环内第一个元素的步数;第二部分为快指针赶上慢指针的步数;第三部分为找环内第一个元素的步数。/** * Definition

2015-05-16 09:56:49 335

原创 UvaOJ 216 Getting in Line

全排列,每次计算距离,记录最小值如果数据量再大些的话,可以用递归进行全排列,及时计算距离并与当前最小值对比,并减枝,在这里就不实现啦~另外不知道为什么在Uva里一用宏就RE,只能把swap和dis改成函数定义了。。。#include #include #include void swap(int* a, int *b) { int tmp = *a; *a = *b;

2015-04-02 14:40:56 531

原创 UvaOJ 10474 Where is the Marble?

快排+lowerbound注意lowerbound的写法即可#include #include int a[10010], n, x;int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b;}int lowerbound() { int i = 0, j = n-1; while (i <=

2015-03-27 12:39:18 378

原创 UvaOJ 592 Island of Logic

此题也是poj 1478解题思路:将所有语句存成结构体的形式,只需要记录说话人,被说人,说话肯否定(not),和对象。处理方法就是将所有情况K列举出来,然后用所有语句S进行判断。如果存在一个k属于K,且满足所有S,则称k被满足。如果出现两个不同的k被满足,就将两组中相同的保留(这些是可以确定的)。具体的判断方式,在这里我全部用一组宏来进行判断。搜索时,只搜索被提到的人物的状态,注意昼夜

2015-03-26 21:51:22 406

原创 UvaOJ 729 The Hamming Distance Problem

只需从0开始到2^n枚举,输出二进制下1的个数有h个的数#include int count1(int x) { int cnt = 0; for ( ; x ; x>>=1) if (x & 1) cnt++; return cnt;}int main() { int l, n, h, i, j; scanf("%d", &l); while(l--) {

2015-03-21 00:59:34 378

原创 UvaOJ 10098 Generating Fast, Sorted Permutation

生成“下一个排列”思想还是参见我的这篇文章UvaOJ 146 ID Codes#include #include #include char s[11];int l, n;int cmp(const void* a, const void* b) { return *(char*)a - *(char*)b;}void swap(int l, int r) {

2015-03-21 00:20:46 419

原创 UvaOJ 110 Meta-Loopless Sorts

此题等价于考察生成给定数量元素的全排列考虑n = 3的情况,相应的3个变量为a, b, c。在结果集里加入a作为初始化,之后b可以在a前面或后面2种位置可以插入,分别代表b a的情况。这样就可以生成第1级的if-else语句,并递归调用至2级。对于"ba"顺序的结果集,c有三种位置可以插入,对应的语句应该是:if c < b then...else if c < a then...

2015-03-20 23:31:24 405

原创 UvaOJ 146 ID Codes

题目要求:求一个字符串的“下一个排列”主要思想:从后向前,直到找到一个位置i使得s[i-1] 找到i-1之后,第一个小于等于它的字符j    (j之后包括j的字符均小于等于s[i-1],即意味着:如果他们出现在i-1位置上,则这个字串的字典序必在此字串之前)交换s[i-1]和s[j-1]将s[i-1]插入到后面之后,字符串依然为逆序,只需反转后面的部分即可若将swa

2015-03-20 22:38:30 547

原创 UvaOJ 11205 The broken pedometer

暴力枚举法预处理b[i]数组,按序储存所有“二进制有i个1的数”,每行大小在bn中b[16][7000]:16表示最多用到b[15](二进制下有15个1),7000表示要大于C(15, 7)=6435log变量表示最少需要多少位才能表示n个状态,其实是log(n)+1首先用变量i枚举有几个1,再用变量j枚举具体的值,统计以b[i][j]做掩码后是否所有值均不相同。

2015-03-19 22:08:14 504

原创 UvaOJ 10167 Birthday Cake

直接枚举法RE了几次,原因是用了goto语句,也许Uva不支持goto?对所有可行解只输出一个即可。。。Uva评测还挺高级的。#include #define N 110int gcd(int a, int b) { int r; if (a < b) r = a, a = b, b = r; r = a % b; while(r) a = b,

2015-03-19 21:29:51 896

原创 经典PV问题系列三:习题归纳

1

2014-11-10 10:03:40 14558 1

原创 经典PV问题系列二:经典详解

上一节讨论了计算机解决互斥问题的方法,这一节我们将

2014-11-07 22:38:52 5035

原创 经典PV问题系列一:解决互斥

这几天正在学PV,觉得网上的总结都不全面,还是自己归纳yixi

2014-11-07 12:12:19 4081 1

空空如也

空空如也

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

TA关注的人

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