leetcode

LeetCode 394

匿名 (未验证) 提交于 2019-12-03 00:19:01
LeetCode 394 Decode String 说明:在提交测试过程中发现很多自己没想到的情况,在原基础上进行修改,可能思路看起来不太清晰,有心情再完善吧(很大可能忘了)。不看也罢,谨以此纪念我产生的代码垃圾。 Problem Description: 对给出的一串简略字符串进行翻译还原 具体的题目信息: https://leetcode.com/problems/decode-string/description/ Examples: (1) 3[bc2[a]d] (2) 2[as]de (3) dea3[sa] Solution: 根据读取到的不同字符进行相应的操作: 若读取到 “ [ ”:用flag变量记录该字符出现的次数,方便后续对单个字符(没有中括号包含起来的字符)进行操作 若读取到数字:根据此时flag大小及其他判断条件输出单个字符 若读取到字母:直接push进栈 若读取到 “ ] ”:对栈中字符进行输出处理 class Solution { public : string decodeString( string s) { string result = "" ; stack < char > zifu; stack < char > rezifu; int flag = 0 ; for ( int i = 0 ; i < s.length(); i++) {

leetcode 229. Majority Element II

匿名 (未验证) 提交于 2019-12-03 00:18:01
leetcode 229. Majority Element II 题意:给你一个数组,让你找出里面出现次数大于[n/3]次的数,n是数组总数。 要求:时间复杂度O(n),空间复杂度O(1) 思路:题目感觉很熟悉,剑指offer里面有一道题目是找一个数组里面出现超过一般的数,往那方面想。 首先,出现超过[n/3]的数最多只有两个。 我们用a1,a2表示这两个数,num1,num2表示这个数出现的次数。 遍历整个数组,和a1,a2相同的话,num1,num2加1,不同的话减1; a1,a2没有值得话赋值。 但是a1,a2出现的次数不一定超过[n/3],但是次数肯定是最多的两个。 最后再看看次数就好了。 class Solution { public: vector<int> majorityElement(vector<int>& nums) { vector<int> ans; if(nums.size() == 0) return ans; int cout1=0,cout2=0,num1 = -1,num2 = -1; for(int i=0;i<nums.size();i++) { if( nums[i] == num1) { cout1++; } else if( nums[i] == num2) { cout2++; } else if(cout1 == 0 ) {

Leetcode――718. Maximum Length of Repeated Subarray(DP重要)

匿名 (未验证) 提交于 2019-12-03 00:18:01
https://leetcode.com/problems/maximum-length-of-repeated-subarray/description/ Given two integer arrays A and B, return the maximum length of an subarray that appears in both arrays. Example 1: Input: A: [1,2,3,2,1] B: [3,2,1,4,7] Output: 3 Explanation: The repeated subarray with maximum length is [3, 2, 1]. Note: 1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100 我们使用一个二维的 dp 数组,其中 dp[i][j] 表示数组A的前i个数字和数组B的前j个数字的最长子数组的长度,如果dp[i][j]不为0,则A中第i个数组和B中第j个数字必须相等,比对于这两个数组[1,2,3,2,1]和[3,2,1,4,7],我们的dp数组为: 数组 1 2 3 2 1 3 0 0 1 0 0 2 0 0 0 2 0 1 1 0 0 0 3 4 0 0 0 0 0 7 0 0 0 0 0 观察dp[i][j]不为0的点

leetcode 102. 二叉树的层次遍历

匿名 (未验证) 提交于 2019-12-03 00:18:01
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 例如: 给定二叉树: [3,9,20,null,null,15,7] , 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [ 3 ], [ 9 , 20 ], [ 15 , 7 ] ] ˼·: 二叉树的层次遍历通过队列来进行,先将root进队,进入循环。 判断队列是否为空,不为空将此时队列中的元素一个一个出队,同时将子女入队。 这样每次出队的元素都为一个层次中的。 这是广度优先搜索, 深度优先搜索用栈来进行。 代码: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public : vector < vector <int> > levelOrder ( TreeNode * root ) { vector < vector <int> > vec ; if ( root == NULL ){ return vec ; } queue < TreeNode *

LeetCode.1189-balloon实例数最大值(Maximum Number of Balloons)

匿名 (未验证) 提交于 2019-12-03 00:11:01
这是小川的第 416 次更新,第 449 篇原创 今天介绍的是 LeetCode 算法题中 Easy 级别的第 267 题(顺位题号是 1189 )。给定一个字符串文本,使用文本字符来构成单词 "balloon" 的尽可能多的实例。每个字符最多可以在文本中使用一次。返回可以形成的最大实例数。 例如: 输入:text = "nlaebolko" 输出:1 输入:text = "loonbalxballpoon" 输出:2 输入:text = "leetcode" 输出:0 约束 : 1 <= text.length <= 10^4 文本字符串仅包含小写英文字母。 题目的意思是要在一个给定的字符串中,找到能够组成字符串 "balloon" 的最大字符对数,本质上和木桶装水的容量由短板决定类似。 直接遍历text字符串中的字符,对字母 a 、 b 、 l 、 n 、 o 的出现次数计数,因为l和o是需要两个,在计数完后,需要对 l 和 o 的次数除2,然后比较5个字母出现次数的最小值,因为只有出现次数最小的那个字母才能最终决定组成多少个 "balloon" 。 public int maxNumberOfBalloons(String text) { if (text == "" || text.length() < 7) { return 0; } int A = 0, B = 0,

LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)

匿名 (未验证) 提交于 2019-12-03 00:07:01
题目标签:Dynamic Programming   题目给了我们一组 cost,让我们用最小的cost 走完楼梯,可以从index 0 或者 index 1 出发。   因为每次可以选择走一步,还是走两步,这里用 dynamic, 从index 2 (第三格楼梯开始) 计算每一个楼梯,到达需要用的最小cost。   在每一个楼梯,只需要计算 从前面2格楼梯过来的cost, 和 从前面1格楼梯过来的 cost,哪个小。就选哪个叠加自己的cost。最后 index = len 的地方就是走到top 所用的最小cost。 Java Solution: Runtime: 1 ms, faster than 99.86% Memory Usage: 37.9 MB, less than 92.86 % 完成日期:08/15/2019 关键点:dynamic programming class Solution { public int minCostClimbingStairs ( int [] cost ) { int len = cost . length ; int [] mc = new int [ len + 1 ]; // base cases mc [ 0 ] = cost [ 0 ]; mc [ 1 ] = cost [ 1 ]; for ( int i = 2 ; i <

LeetCode实战:存在重复元素

匿名 (未验证) 提交于 2019-12-03 00:05:01
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织“算法刻意练习活动”的? 为什么要求团队的学生们写技术Blog 题目英文 Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct. Example 1 : Input : [ 1 , 2 , 3 , 1 ] Output : true Example 2 : Input : [ 1 , 2 , 3 , 4 ] Output : false Example 3 : Input : [ 1 , 1 , 1 , 3 , 3 , 4 , 3 , 2 , 4 , 2 ] Output : true 题目中文 给定一个整数数组,判断是否存在重复元素。 如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 1 : 输入 : [ 1 , 2 , 3 , 1 ] 输出 : true 示例 2 : 输入 :

leetcode整理(一)

匿名 (未验证) 提交于 2019-12-02 23:59:01
1. 回文数 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1 : 输入: 121 输出: true 示例 2 : 输入: - 121 输出: false 解释: 从左向右读, Ϊ - 121 。 从右向左读, Ϊ 121 - 。因此它不是一个回文数。 示例 3 : 输入: 10 输出: false 解释: 从右向左读, Ϊ 01 。因此它不是一个回文数。 # 思路:将整数转化为字符串,用字符串切片的方法,步长取-1,将字符串反转,与原数比较 def func ( x ): if x == int ( str ( x )[::- 1 ]): return True else : return False res = func ( 121 ) 2. 两数之和 给定一个整数数组 nums 和一个目标值 target ,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [ 2 , 7 , 11 , 15 ], target = 9 因为 nums [ 0 ] + nums [ 1 ] = 2 + 7 = 9 所以返回 [ 0 , 1 ] # 思路:用目标值target减去数组中的一个值,比较

Leecode-C++ (easy) 1~5

匿名 (未验证) 提交于 2019-12-02 23:51:01
001 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/two-sum class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> myVector; map<int,int> myMap; for (int i =0;i<nums.size();i++){ if(myMap.find(target-nums[i])==myMap.end()) //没有找到,添加到map中;map自身有find方法。 { myMap[nums[i]]=i; }else{ myVector={myMap[target-nums[i]],i}; break; } } return myVector; } }; 007 整数反转 给出一个 32

[LeetCode] 139. 单词拆分

匿名 (未验证) 提交于 2019-12-02 23:49:02
题目链接 : https://leetcode-cn.com/problems/word-break/ 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = "leetcode" , wordDict = [ "leet" , "code" ] 输出: true 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code" 。 示例 2: 输入: s = "applepenapple" , wordDict = [ "apple" , "pen" ] 输出: true 解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple" 。 注意你可以重复使用字典中的单词。 示例 3: 输入: s = "catsandog" , wordDict = [ "cats" , "dog" , "sand" , "and" , "cat" ] 输出: false ˼·: 动态规划 思路一:自顶向下, 思路二:自底向上, dp[i] 表示 s 到 i 位置是否可以由 wordDict 组成 所以有 如果 dp[i - j] 是 true