leetcode习题代码(经常更新)
2015-03-22 23:45
459 查看
为了准备面试编程题,我最近准备刷一刷leetcode,我是从191开始往前刷,把accept过的代码贴上来
leetcode 191
leetcode 190:
189没看明白题目。不过看起来很简单的样子
leetcode 188,说实话,这题是我见过最奇怪的动态规划,像背包,但是又想不出好的解法,一时半会儿真弄不明白。有篇博客讲得不错:http://blog.csdn.net/linhuanmars/article/details/23236995
leetcode 187
这题坑爹的地方,我用hash居然报MLE,我把数组开到最小居然还报,后来改成map才过,这烂judge真坑爹!
下面是hash+vector版本:
AC版本map:
两种解法时间复杂度都是O(n);
leetcode 179
这题有两种方案,一是搜索,但无疑会Tle,另一种是排序,两个方案的思想都很好,不针对题目,将两个方案的代码都列出来:
1.搜索代码TLE:
2。java排序方法
leetcode 174比较简单的dp
leetcode 191
class Solution { public: int hammingWeight(uint32_t n) { int ans = 0; long long tmp = 1; while(tmp <= n) { if ((tmp & n) != 0) { ans ++; } // printf("tmp = %d tmp & n = %d\n",tmp,tmp & n); tmp <<= 1; } return ans; } };
leetcode 190:
class Solution { public: uint32_t reverseBits(uint32_t n) { long long ans = 0; long long tmp = 1; for (unsigned int i=1; i;i<<=1) { ans <<= 1; if (tmp & n) { ans ++; } tmp <<= 1; } return ans; } };
189没看明白题目。不过看起来很简单的样子
leetcode 188,说实话,这题是我见过最奇怪的动态规划,像背包,但是又想不出好的解法,一时半会儿真弄不明白。有篇博客讲得不错:http://blog.csdn.net/linhuanmars/article/details/23236995
class Solution { public: int maxProfit(int k, vector<int> &prices) { int size = prices.size(); if (k >= size) { int sum = 0; for (int i=1; i<size; i++) { sum += max(prices[i] - prices[i - 1],0); } return sum; } int local[k + 1]; int global[k + 1]; for (int i=0; i<=k; i++) { local[i] = global[i] = 0; } for (int i=0; i<size - 1; i++) { int length = prices[i + 1] - prices[i]; for (int j=k; j>=1; j--) { local[j] = max(global[j - 1] + max(length,0),local[j] + length); global[j] = max(global[j],local[j]); } } return global[k]; } };
leetcode 187
这题坑爹的地方,我用hash居然报MLE,我把数组开到最小居然还报,后来改成map才过,这烂judge真坑爹!
下面是hash+vector版本:
class Solution { public: vector<string> f[10000]; int get_num(char c) { int ans = 0; switch (c) { case 'A': { ans = 1; break; } case 'G': { ans = 2; break; } case 'C': { ans = 3; break; } case 'T': { ans = 4; break; } } return ans; } long long get_sum(int num) { long long ans = num; for (int i=0; i<9; i++) { ans *= 10; } return ans; } vector<string> findRepeatedDnaSequences(string s) { vector<string> ans; int size = s.length(); int mod = 9997; long long sum = 0; long long sum1 = 0; int start = 0,tail = 10; if(s == "" || size == 0) { printf("size = %d\n",size); return ans; } for (int i=0; i<10; i++) { int tmp = get_num(s[i]); sum1 *= 10; sum1 += tmp; sum = sum1 % mod; } if (size > tail) { f[sum].push_back(s.substr(0,10));; start = 1; while(tail < size) { sum1 -= (get_sum(get_num(s[start - 1])));; sum1 *= 10; sum1 += get_num(s[tail]); sum = sum1 % mod; if (f[sum].size() > 0) { for (int i=0; i<f[sum].size(); i++) { if (f[sum][i] == s.substr(start,10)) { ans.push_back(s.substr(start,10)); } else { f[sum].push_back(s.substr(start,10)); } } } else { f[sum].push_back(s.substr(start,10)); } start ++; tail ++; } } return ans; } };//mle
AC版本map:
int get_num(char c) { int ans = 0; switch (c) { case 'A': { ans = 1; break; } case 'G': { ans = 2; break; } case 'C': { ans = 3; break; } case 'T': { ans = 4; break; } } return ans; } long long get_sum(int num) { long long ans = num; for (int i=0; i<9; i++) { ans *= 10; } return ans; } vector<string> findRepeatedDnaSequences(string s) { vector<string> ans; int size = s.length(); int mod = 990023; long long sum = 0; long long sum1 = 0; map<long long,int> m; int start = 0,tail = 10; if(s == "" || size == 0) { return ans; } for (int i=0; i<10; i++) { int tmp = get_num(s[i]); sum1 *= 10; sum1 += tmp; } m[sum1] ++; if (size > tail) { start = 1; while(tail < size) { sum1 -= (get_sum(get_num(s[start - 1])));; sum1 *= 10; sum1 += get_num(s[tail]); if (m[sum1] > 0) { if (m[sum1] == 1) ans.push_back(s.substr(start,10)); } m[sum1]++; start ++; tail ++; } } // for (int i=0; i<ans.size(); i++) // { // cout<<ans[i]<<endl; // } return ans; }
两种解法时间复杂度都是O(n);
leetcode 179
这题有两种方案,一是搜索,但无疑会Tle,另一种是排序,两个方案的思想都很好,不针对题目,将两个方案的代码都列出来:
1.搜索代码TLE:
#include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <cstring> #include <vector> using namespace std; string int2str(int num) { int tmp = 0; string ans; char s[100]; int length = 0; while(num > 0) { tmp = num % 10; s[length++] = (tmp + '0'); num /= 10; } s[length] = '\0'; reverse(s,s+length); ans = s; // cout<<"ans = "<<ans<<endl; return ans; } string ans; bool vis[10010]; void get_ans(vector<int> &num,string tmp,int n) { int size = num.size(); if (n == num.size() - 1) { if (ans < tmp) { ans = tmp; } return ; } for (int i=0; i<size; i++) { if (vis[i] == 0) { vis[i] = 1; get_ans(num,tmp + int2str(num[i]),n + 1); vis[i] = 0; } } } string largestNumber(vector<int> &num) { get_ans(num,"",0); return ans; } int main() { memset(vis,0,sizeof(vis)); vector<int> num; for (int i=0; i<6; i++) { num.push_back(i); } largestNumber(num); cout<<"ans = " <<ans<<endl; return 0; }
2。java排序方法
public class Solution { public static String largestNumber(int[] num) { int length = num.length; String[] ans = new String[length]; for (int i=0; i<length; i++) { ans[i] = num[i] + ""; } Arrays.sort(ans,new MyCompare()); String res = ""; for (int i=0; i<length; i++) { res += ans[i]; } int index = -1; for (int i=0; i<res.length(); i++) { if (res.charAt(i) == '0') { index = i; } else { break; } } if (index != -1) return res.substring(index); else { return res; } } } class MyCompare implements Comparator<String> { public int compare(String o1, String o2) { String s1 = (String) o1; String s2 = (String) o2; int res = (s1 + s2).compareTo(s2 + s1); if (res < 0) return 1; else { return -1; } } }
leetcode 174比较简单的dp
public int calculateMinimumHP(int[][] dungeon) { int m = dungeon.length; int n = dungeon[0].length; int[][] ans = new int[m] ; ans[m - 1][n - 1] = dungeon[m - 1][n - 1] > 0 ? 0 : -dungeon[m - 1][n - 1]; for (int i = m - 2; i >= 0; i--) { ans[i][n - 1] = dungeon[i][n - 1] >= ans[i + 1][n - 1] ? 0 : ans[i + 1][n - 1] - dungeon[i][n - 1]; } for (int j = n - 2; j >= 0; j--) { ans[m - 1][j] = dungeon[m - 1][j] >= ans[m - 1][j + 1] ? 0 : ans[m - 1][j + 1] - dungeon[m - 1][j]; } for (int i = m - 2; i >= 0; i--) { for (int j = n - 2; j >= 0; j--) { int down = dungeon[i][j] >= ans[i + 1][j] ? 0 : ans[i + 1][j] - dungeon[i][j]; int right = dungeon[i][j] >= ans[i][j + 1] ? 0 : ans[i][j + 1] - dungeon[i][j]; ans[i][j] = Math.min(down, right); } } return ans[0][0] + 1; }
相关文章推荐
- 《Python核心编程》部分代码习题实践(持续更新)
- (Python)LeetCode 习题代码(部分)
- 整理一些经常用到的js代码(一) 不断更新中。。。
- 经常使用的C#代码(每日更新)
- android开发常用代码(经常更新)
- 使用 SVN post-commit 钩子同步更新代码 经常会忽略的问题
- LeetCode合集:题目、分析、代码……不定时更新
- 更新数据的经典代码
- 最近的项目,也许是产品吧,用的客户好几个,数据库也经常更新,所以就写了个比较数据库表和字段有不同的存储过程
- 常见代码的编写规范(四)---对象的保存与更新
- 经常用到的javaScript技术代码(经典)
- 制作网页过程中经常要用到的代码
- ASP常用的代码(不断更新)
- 安装Oracle后,经常使用的修改表空间的SQL代码
- 我收藏/更新的JavaScript/DHTML代码.(随时更新)
- [收藏]经常用到的javaScript技术代码(经典)
- 生成/读取(反向更新数据库) Excel文件(示例代码下载)
- Delphi 程序经常用到的公共代码 Tools.pas
- 安装Oracle后,经常使用的修改表空间的SQL代码
- ASP分页代码更新 (利用微软自己提供的pagesize功能)