LeetCode刷题
Kang_TJU
Talk is cheap!
展开
-
leetcode-27-Remove Element 顺序表
问题问题:[leetcode-27]思路跟26题一个思路,记录变量的重复次数。 不是val的时候,向前移动 nums[i-k] = nums[i]代码class Solution {public: int removeElement(vector<int>& nums, int val) { int k = 0; // 重复元素个数 int sz = nu原创 2016-11-02 09:13:00 · 320 阅读 · 0 评论 -
leetcode-80-Remove Duplicates from Sorted Array II 顺序表
问题题目:[leetcode-80]思路本质和25,26一个思路。但是我第一遍没有过。说说我的问题, 不是每次循环都有nums[i-k] = nums[i]的。这样的结果会导致[1,1,1]这样的测试用例过不去,因为output中包含了1这个元素。所以,整体的逻辑分两部分。重复元素累加k非重复元素进行赋值代码class Solution {public: int removeDup原创 2016-11-02 09:35:44 · 344 阅读 · 0 评论 -
leetcode-118-Pascal's Triangle 基础题
问题题目:[leetcode-118]思路基础题,杨辉三角。代码class Solution {public: vector<vector<int>> generate(int numRows) { vector< vector<int> > ret; for( int i = 0; i < numRows; ++i ) {原创 2016-11-02 10:37:47 · 470 阅读 · 0 评论 -
leetcode-4-Median of Two Sorted Arrays 顺序表
问题题目:[leetcode-4]思路朴素的方法:合并两个序列排序返回中值即可复杂度主要在第二部的排序上面,O(log(m+n))。可以接收,可行。改进的方法: 考虑到两个序列有序的特性,可以采用merge的思路去做,复杂度是O(m+n). 具体来说,归并的框架。计数器变量设置为实际元素的下标,由于并不需要整个的数组,所以不用额外分配空间。代码// c version 朴素的思路int原创 2016-11-09 20:22:59 · 310 阅读 · 0 评论 -
leetcode-300-Longest Increasing Subsequence 动态规划
问题题目:[leetcode-300]思路参照此前另一篇文章[最长递增子序列(LIS)-动态规划]代码int lengthOfLIS(int* nums, int numsSize) { if( NULL == nums || numsSize <= 0 ) return 0; int* dp = (int*)malloc( sizeof(int) * numsSize原创 2016-11-29 15:38:54 · 356 阅读 · 0 评论 -
leetcode-26-Remove Duplicates from Sorted Array 顺序表
问题题目:[leetcode-26]思路这个题目在数据结构实现的地方复习过,思路设置重复元素个数变量。 每次前移操作为 nums[i - k] = nums[i];代码class Solution {public: int removeDuplicates(vector<int>& nums) { map<int, bool> mapper; int sz原创 2016-11-01 21:47:34 · 489 阅读 · 0 评论 -
leetcode-9-palindrome 顺序表
问题题目:[leetcode-9]思路回文的思路,但是关键是不许借助额外空间。代码其实这么做,不符合要求。但是也过了。class Solution {public: bool isPalindrome(int x) { std::stringstream ss; ss << x; std::string ret; ss >>原创 2016-12-16 18:02:50 · 335 阅读 · 0 评论 -
leetcode-283-Move Zeros 顺序表
问题题目:[leetcode-283]思路代码// c versionvoid moveZeroes(int* nums, int numsSize) { if( NULL == nums || numsSize <= 0 ) return ; for( int i = 0; i < numsSize - 1 ; ++i ) { if( !nu原创 2016-11-07 23:54:04 · 459 阅读 · 0 评论 -
leetcode-38-Count and Say 基础题
问题题目:[leetcode-38]思路1, 11, 21, 1211, 111221, …1 is read off as “one 1” or 11. 11 is read off as “two 1s” or 21. 21 is read off as “one 2, then one 1” or 1211.从样本来看,每一组的数字是在上一组数字的基础上获得的,所以原问题和子问题有关联,考原创 2016-12-21 22:36:10 · 458 阅读 · 0 评论 -
leetcode-456-Convert a Number to Hexadecimal
问题题目:[leetcode-456]思路这个题主要涉及的是计算机中信息表示的方法。对于一个数字,在计算机中怎么表示的方法。对于有符号数,一般用(two’s complement)实现。当然,我们在解决这个题目的时候,并不按照之之前最基本的那一套去求解。而是充分考虑信息在计算机中的表示。我们知道有一个结论是:对于用补码表示的任何一个数,一定存在一个无符号数与它的表示一致。当然,这也很容易理解,对于同原创 2017-01-02 20:30:45 · 433 阅读 · 0 评论 -
leetcode-2-AddTwoNumbers
问题题目:[leetcode-2]思路思路比较简单,但是不容易一次把所有情形考虑正确。大的框架是merge的思路。但是进位的处理要小心。最后在p,q都为空的情形再次处理进位。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * Lis原创 2016-12-23 14:01:22 · 325 阅读 · 0 评论 -
leetcode-31-NextPermutation
问题题目:[leetcode-31]思路上来先来个STL的套路代码class Solution {public: void nextPermutation(vector<int>& nums) { std::next_permutation( nums.begin(), nums.end() ); }};原创 2016-12-18 09:54:44 · 429 阅读 · 0 评论 -
leetcode-47-Permutations II 搜索-剪枝
问题题目:[Permutations II]思路上来下来个简单的办法,STL套路。代码class Solution {public: vector<vector<int>> permuteUnique(vector<int>& nums) { std::vector< std::vector<int> > ret; std::sort( nums.begin(原创 2016-12-17 22:44:58 · 370 阅读 · 0 评论 -
leetcode-14-Longest Common Prefix
问题题目:[leetcode-14]思路思路不难,和上一道题目不多。反正都是枚举子串。 注意前缀的定义,从首部开始的子串。必须要包含首部。比如abcd,前缀有ϵ\epsilon,a,ab,abc,abcd. 思路就是:所有子串的首部同时开始判断,如果有一个不相等。结束。代码/*前缀只能从首部开始,所以枚举所有子串的首部即可.*/class Solution {public: str原创 2016-12-26 11:13:26 · 409 阅读 · 0 评论 -
leetcode-3-LongestSubstringWithoutReaptingCharacters
问题题目:[leetcode-3]思路暴力法。枚举所有子串。按行枚举。 枚举以s[i]为头的所有子串,如果当前子串存在重复元素,跳出。i = i + 1; 注意hash表的清空操作。代码class Solution {public: int lengthOfLongestSubstring(string s) { int sz = s.size(); i原创 2016-12-25 21:10:15 · 430 阅读 · 0 评论 -
leetcode-6-ZigZag Conversion
题目题目:[leetcode-6]思路这个题目的思路是把旧串的位置映射到新串的位置,把位置怎么走的,画个图就出来了。这个题目不难。 但是,我就想强调一点。做的时候,别着急,把思路理清楚了去做。不就很快出来了。一步一步来代码/*思路:这个题目的思路。旧串的位置映射到新串的位置。做的时候,别着急,把思路理清楚了去做。不就很快出来了。一步一步来嘛。*/class Solution {pub原创 2016-12-22 17:31:15 · 405 阅读 · 0 评论 -
leetcode-344- Reverse String
问题题目:[Reverse String]思路回文。代码class Solution {public: string reverseString(string s) { return std::string( s.rbegin(), s.rend() ); }};原创 2016-12-16 18:09:22 · 401 阅读 · 0 评论 -
leetcode-60-Permutation Sequence
问题题目:[leetcode-60]思路当然,用之前枚举的方法可以。不过,不出所料,TLE。毕竟当 k = n时, T(n) = n! = O(n!)只能用另外的思路:这个问题牵扯到另外一个具体的问题。[全排列的编码与解码]可以参考这个链接,讲的比较清楚。我下文的内容也完全参照这个链接,只不过我再自己梳理一遍,两个例题即可。 本质还是利用了阶乘的公式:Fact( n ) = n * Fact( n原创 2016-12-26 15:12:38 · 297 阅读 · 0 评论 -
leetcode-136-Single Number
问题题目:[leetcode-136]思路位运算,利用xor的性质即可。a^a = 0(additive inverse)代码class Solution {public: int singleNumber(vector<int>& nums) { int sz = nums.size(); if(!sz) return 0; int ret原创 2017-01-04 20:55:52 · 304 阅读 · 0 评论 -
leetcode-78-subsets
问题题目:[leetcode-78]思路枚举所有子集,dfs即可。剪枝即之前元素出现过不行。代码class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { std::vector< std::vector<int> > ret; std::vector<int> tmp;原创 2017-01-04 21:44:04 · 279 阅读 · 0 评论 -
leetcode-389-find the difference
问题题目:[leetcode-389]思路有一个问题是字符本生会重复。之前两次WA,就是考虑问题不全面。 两张哈希表,必有一个字符的哈希值会相差1。代码class Solution {public: char findTheDifference(string s, string t) { int s_sz = s.size(); int t_sz = t.原创 2017-01-06 09:24:49 · 362 阅读 · 0 评论 -
leetcode-104-Maximum Depth of Binary Tree
问题题目:[leetcode-104]思路递归,当然直接这么想也行。树的最大深度等于左子树的最大深度和右子树最大深度的最大深度+1。只不过觉得树的最大深度和树的深度有什么区别。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr原创 2017-01-06 10:09:00 · 278 阅读 · 0 评论 -
leetcode-412- Fizz Buzz
问题题目:[leetcode-412]思路枚举判断。代码/*3 : Fizz5:Buzz3&&5FizzBuzz*/class Solution {public: vector<string> fizzBuzz(int n) { std::vector<std::string> ret; for( int i = 1; i <= n; ++i )原创 2016-12-29 19:40:43 · 456 阅读 · 0 评论 -
leetcode-448- Find All Numbers Disappeared in an Array
问题题目:[leetcode-448]思路设置标志数组,未出现的不置位。代码class Solution {public: vector<int> findDisappearedNumbers(vector<int>& nums) { std::vector<int> ret; int sz = nums.size(); if(!sz)原创 2016-12-29 19:50:10 · 487 阅读 · 0 评论 -
leetcode-463- Island Perimeter
题目题目:[Island Perimeter]思路指定边界规则:小心点是避免重复 对于任何一个点应该是判断四个方向: 为0,有一条 越界,有一条代码class Solution {public: int islandPerimeter(vector<vector<int>>& grid) { int row = grid.size(); if(!row原创 2016-12-30 09:27:27 · 407 阅读 · 0 评论 -
leetcode-476- Number Complement
问题题目:[leetcode-476]思路朴素的思路没什么好说的。转化成位向量的形式去做。代码(位向量)class Solution {public: int findComplement(int num) { int bit[32]; std::memset( bit, 0, sizeof(bit) ); int idx = 0;原创 2017-01-13 15:10:21 · 426 阅读 · 0 评论 -
leetcode-191- Number of 1 Bits
问题题目:[leetcode-191]思路比较简单,移位操作。代码class Solution {public: int hammingWeight(uint32_t n) { int ans = 0; while( n ){ if( n&1 ) ++ans; n >>= 1; }原创 2017-01-13 11:15:32 · 444 阅读 · 0 评论 -
leetcode-231-Power of Two
问题题目:[leetcode-231]思路n&(n-1)的妙用。 它的作用是把位向量当中,最低位的1置0;代码class Solution {public: bool isPowerOfTwo(int n) { return ( n > 0 && !(n&(n-1)) ); }};原创 2017-01-13 15:53:25 · 230 阅读 · 0 评论 -
leetcode-383-Ransom Note
问题题目:[leetcode-383]思路哈希表记录一下。代码class Solution {public: bool canConstruct(string ransomNote, string magazine) { int hash[128]; std::memset( hash, 0, sizeof(hash) ); int sz_m原创 2017-01-13 16:05:14 · 253 阅读 · 0 评论 -
leetcode-258- Add Digits
问题题目:[leetcode-258]思路拿到每一位求和就好了。代码/*思路简单:计算数字和,直到这个数字只有一位*/class Solution {public: int addDigits(int num) { do num = bit_sum(num); while (num>9); return num; }private原创 2017-01-09 21:07:05 · 326 阅读 · 0 评论 -
leetcode-455-Assign Cookies
问题题目:[leetcode-455]思路简单贪心,尽量从小的g[i]开始,对于每一个g[i],从小的s[j]开始。没有数学证明,但是贪心这一块一般是反证法。直觉上觉得就是尽量留大的s[j]试探,这样才可能试探更多的g[i]代码class Solution {public: int findContentChildren(vector<int>& g, vector<int>& s) {原创 2017-01-09 21:12:27 · 327 阅读 · 0 评论 -
leetcode-349-Intersection of Two Arrays
问题题目:[leetcode-349]思路朴素的思路就是让一个数组的元素去枚举另外一个数组的元素,如果存在。则是交集元素。但是要注意的是可能存在元素重复的情形。比如A = [1,1], B = [1]。代码class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {原创 2017-01-14 12:43:15 · 507 阅读 · 0 评论 -
leetcode-350-Intersection of Two Arrays II
问题题目:[leetcode-350]思路感觉这道题比之前那道更简单,都不用考虑重复的情形。 当然用集合还是最快,我试了下两个指针也可以。代码class Solution {public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { int i = 0; int j = 0原创 2017-01-14 13:08:47 · 500 阅读 · 0 评论 -
leetcode-260-SingleNumber III
问题题目:[leetcode-260]思路可参考这个链接[数组中只出现1次的两个数字(百度面试题)]。下面是我自己的总结:首先,对于只有一个不同的数字的情形。xor可以解决。但是对于本题,由于出现两个只出现一次的数字。所以,xor的结果是最后这两个数字的xor结果。所以,直接这么做不可以。不妨这么考虑,由于a和b是出现在同一个数组中。所以没法分开,如果把它们分到不同的数组中,对于这两个不同的数组而言原创 2017-01-10 16:36:07 · 239 阅读 · 0 评论 -
leetcode-268-Missing Number
问题题目:[leetcode-268]思路主要是对空间的限制比较严格。 想到的办法就是,反正就是数组嘛。也没什么别的方法,试试加起来看看,或者减一下试试。 需要特别注意的是:[1,2,3]和[0,1,2]这种他们本生就是等差数列。要判断初始项是不是为0。代码class Solution {public: int missingNumber(vector<int>& nums) {原创 2017-02-06 23:59:00 · 349 阅读 · 0 评论 -
leetcode-242-Valid Anagram
问题题目:[Valid Anagram]思路排序跟哈希都可以,注意,长度不同直接返回就好。代码class Solution {public: bool isAnagram(string s, string t) { if( s.size() != t.size() ) return false; sort(s.begin(), s.en原创 2017-01-21 01:10:02 · 312 阅读 · 0 评论 -
leetcode-1-TwoSum 哈希表
问题题目:leetcode-1思路首先,朴素的思路非常容易想。O(n2)O(n^{2})的复杂度。 改用hash表去做。 大致分两步,记录每个元素位置循环:枚举每一个元素 2.1. 用target - 当前元素,获取对应元素。 2.2. 判断对应元素是否在hash表中 2.2.1. 若在,判断两元素是否一样 2.2.1.1 如果不一样,找到一对匹配,返原创 2016-11-01 21:05:08 · 474 阅读 · 0 评论 -
leetcode-500-Keyboard Row
问题题目:[leetcode-500]思路简单题,没什么说的。注意isOnlyOneRow里面常量字符串可以写成static。这样不用反复开辟和销毁。增强生存期。代码class Solution {public: vector<string> findWords(vector<string>& words) { std::vector<std::string> ret;原创 2017-02-07 16:21:51 · 1040 阅读 · 0 评论 -
leetcode-496-Next Greater Element I
问题题目:[leetcode-496]思路简单题,仔细一点。代码class Solution {public: vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) { int sz1 = findNums.size(); int sz2 = nums.size();原创 2017-02-07 16:40:16 · 1696 阅读 · 0 评论 -
leetcode-387-First Unique Character in a String
问题题目:[leetcode-387]思路思路很简单,首先枚举一遍。记录hash值。然后,还是根据s进行枚举,找到hash值为1的返回即可。 关键是一定要按照s的顺序进行枚举。代码class Solution {public: int firstUniqChar(string s) { int hash[128]; std::memset( hash, 0原创 2017-01-16 22:44:35 · 268 阅读 · 0 评论