leetcode
通过刷题锻炼算法和java
NUAA丶无痕
让学习成为一种习惯,我们的目标是星辰大海!
展开
-
leetcode 58:最后一个单词的长度
题目算法思想:java自带的split函数很方便做出来,但不是很快,最快的做法是从字符串尾部开始判断,寻找第一次出现的连续字符的个数。代码 public int lengthOfLastWord(String s) { int length = 0; for(int i = s.length()-1;i >= 0;i--) ...原创 2019-10-14 23:15:34 · 127 阅读 · 3 评论 -
leetcode 20:有效的括号
题目算法思想:左括号入栈,右括号去匹配栈顶元素,不匹配则表示出错,最后结束的时候判断栈是否为空,表示是否全部匹配完,java需要注意栈空异常。代码 public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for(int i =...原创 2019-10-14 23:12:17 · 96 阅读 · 0 评论 -
leetcode 1:两数之和
题目算法思想方法一:循环求解,遍历所有组合判断是否与目标值相等,时间复杂度较高。方法二:用hashmap存储数组元素,来快速搜索target-nums[i]代码#方法一public int[] twoSum(int[] nums, int target) { for(int i = 0;i < nums.length - 1;i++) { ...原创 2018-08-30 00:52:50 · 116 阅读 · 0 评论 -
leetcode 7: 反转整数
题目算法思想 :考虑到溢出,所以根据整数最大值INF/10比较,而不能和最大值比较,x%10表示取整数的最后一位,result = result*10 + tmp表示反转整数后的结果,其中最大正整数最后一位是7,最小负整数最后一位是8。代码:public int reverse(int x) { int sum = 0; while (x != 0){ ...原创 2018-08-30 00:56:23 · 167 阅读 · 0 评论 -
leetcode 9 : 回文数
题目算法思想:如果数字小于0或者以0结尾,肯定不是回文数,否则我们只需要从数字两端向中间比较,如果有一个不同就不是回文数,数字位数是奇数的话也不影响结果。代码:public boolean isPalindrome(int x) { if(x < 0 || (x % 10 == 0 && x != 0)){ return false;...原创 2018-08-30 01:06:27 · 113 阅读 · 0 评论 -
leetcode 13:罗马数字转整数
题目算法思想:首先用map存储所有值,然后对于输入的罗马数字,从左到右,给定一个指针指向当前罗马数字,如果当前罗马数字小于后面一个,则总和rev减去当前罗马数字,否则当前罗马数字大于等于后一个或者到末尾,则rev加上当前罗马数字。代码:public int romanToInt(String s) { HashMap<Character,Integer> h...原创 2018-08-30 01:12:10 · 142 阅读 · 0 评论 -
leetcode 14: 最长公共前缀
题目算法思想 :循环遍历即可,第一层循环是第一个字符串,然后判断后面的字符串,如果后面的字符串到达尾部或出现不同的字符则结束循环。代码public String longestCommonPrefix(String[] strs) { String result = ""; if(strs.length < 1){ return result...原创 2018-08-30 01:22:24 · 132 阅读 · 0 评论 -
leetcode 21 : 合并两个有序链表
题目:算法思想 :因为两个链表是有序的,所以额外创建一个头结点,然后按照顺序依次把l1,l2的头结点插入到新的链表的尾部,注意最后需要额外判断一下,因为两个链表不一定是同时结束的代码:public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null){ return l2; ...原创 2018-08-30 01:30:52 · 139 阅读 · 0 评论 -
leetcode 26 : 删除排序数组中的重复项
题目:算法思想:因为不能开辟新的空间,所以我们需要直接在原数组进行修改。我们定义index表示当前比较的元素下标,然后length表示需要返回的长度。当遇到不同元素时把比较元素后面那个元素替换掉,遇到相同元素长度减一代码:public int removeDuplicates(int[] nums) { if(nums.length == 0){ retu...原创 2018-08-30 01:38:21 · 115 阅读 · 0 评论 -
leetcode 27 :移除元素
题目:算法思想 :定义两个下标分别从数组头尾开始,分别叫头数据和尾数据,头数据与目标值相等的时候把尾部的一个非目标数据替换掉,同时数组长度减一,替换的时候先要找到非目标值的尾数据,这里要判断处理一下代码: public int removeElement(int[] nums, int val) { if(nums.length == 0) {...原创 2018-08-30 01:45:46 · 172 阅读 · 0 评论 -
leetcode 69 : x的平方根
题目算法思想 :如果我们循环i去判断(i*i) == x ||(i*i)<x && (i+1)*(i+1) >x,这样会超时。所以我们采用二分搜索的方式去减少时间。这里需要注意的是mid = l + (r-l)/2,以及判断x/mid和mid,这样数据就不会溢出。同时需要注意因为循环条件是l < r,所以l = mid+1,不然会进入死循环,最后返回的是l...原创 2018-08-31 00:29:43 · 265 阅读 · 0 评论 -
leetcode 67 : 二进制求和
题目算法思想 :首先题目给的是字符串,我们采用char-'0'得到数字,得出结果后+'0'转换成字符。其次通过转换使得a是较长的字符串,然后第一次循环加完b的长度,我们可以采用^ 异或操作得到加后的结果,用(a[i]+b[i])/2表示进位数,第二次循环得到剩余a的结果。 string addBinary(string a, string b) { if(a.length(...原创 2018-08-31 00:30:26 · 319 阅读 · 0 评论 -
leetcode 53 : 最大子序和
题目算法思想 :这道题有三种解法(1) 遍历所有的连续子数组,求出最大值,这个时间复杂度太高 (2) 利用动态规划的思想,首先我们要知道,如果当前连续子数组的和sum[i-j](表示i到j) + nums[j+1]比nums[j+1]小,说明我们需要重新开始计算区间,同时与最大的子数组的和进行比较,公式表示为 result = max(result + nums...原创 2018-08-31 00:30:37 · 154 阅读 · 0 评论 -
leetcode 66 : 加一
题目算法思想 :这道题目是大整数加法的核心,所谓大整数是即使是long long类型也存储不了,所以我们用数组的方式表示一个非常大的整数,那么我们需要采用小学生加法策略来解决这个问题,首先设置一个进位变量c,然后 进位 c = (nums[i]+c)/10;nums[i] = (nums[i]+c) % 10,最后需要判断如果有进位,则需要再数组前面加上进位,这里采用vector的in...原创 2018-08-31 00:30:45 · 144 阅读 · 0 评论 -
leetcode 38 : 报数
题目 算法思想 :这道题目是求出每个连续相同数字的个数+这个数字,因为第n次输出需要用到第n-1次的数据,所以我们自然而然想到递归去处理这一题,从n=1开始向下一级返回结果就可以了。 string countAndSay(int n) { string result = ""; if(n == 1) result = "1"; ...原创 2018-08-31 00:30:52 · 125 阅读 · 0 评论 -
leetcode 35: 搜索插入位置
题目 算法思想 :这道题目是实现C++的lower_bound()函数,简单做法是直接cout<<lower_bound(nums.begin(),nums.end(),val)<<endl; 我们也可以手动写出这个函数,思想是二分查找,如果查询到则返回位置,否则返回begin就是我们要找的位置。 int binary_search(vector<...原创 2018-08-31 00:31:00 · 161 阅读 · 0 评论 -
leetcode 28 : 实现strStr()
题目 算法思想 :这是典型的字符串匹配,所以本文采用经典的kmp算法,如果你不是很懂kmp算法的原理,https://www.cnblogs.com/yjiyjige/p/3263858.html,这个博主写的非常详细,大家可以直接参考,问题的关键是要匹配的子串的next数组如何求,换句话说是字串的前缀是否在后面出现。 int * getnext(string needle)...原创 2018-08-31 00:31:11 · 180 阅读 · 0 评论 -
leetcode 70 : 爬楼梯
题目算法思想 :这道题目类似斐波那契数列的格式,首先我们要知道不同的方法是怎么产生的,主要是根据爬两层楼梯两种方法得来的,所以我们可以推导出爬楼梯的公式:a[n] = a[n-1] + a[n-2] 其中n>=3.当n<3时直接返回n的值。另外这道题目递归写虽然简单但是会超时,所以我们采用动态规划的思想,用空间换取时间,用数组a记录已经求出的结果。 int climbS...原创 2018-08-31 01:44:47 · 109 阅读 · 0 评论 -
leetcode 83 : 删除排序链表中的重复元素
题目 算法思想 :因为链表是有序的,所以我们定义两个指针p,q来处理,p指针指向起始元素,q指针指向p的下一个元素,如果相等则p继续指向下一个元素直至出现不同元素或者到链表尾部,然后p指向q。注意我们需要释放掉中间不用的节点,养成良好习惯。 ListNode* deleteDuplicates(ListNode* head) { if(head == NULL) ...原创 2018-08-31 14:29:42 · 150 阅读 · 0 评论 -
leetcode 88 : 合并两个有序数组
题目 算法思想 :对于顺序存储的数组来说,我们不能像链式存储那样直接对头结点操作,而是应该倒过来从数组尾部开始。 void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { if(nums1.size() == 0) nums1 = nums...原创 2018-08-31 17:07:42 · 157 阅读 · 0 评论 -
leetcode 101 : 对称二叉树
题目算法思想 :题目提示递归和迭代两种方法,是告诉我们这道题目可以用深度优先搜索和广度优先搜索两种方法。(1)深度优先搜索 DFS 我们主要用递归实现,比较简单。开始搜索根的左右子树,搜索到第三层及以后的时候我们要注意除了判断节点值val是否相等以外,继续向下搜索的时候要搜索 (左边子树的左节点和右边子树的右节点) && (左边子树的右节点和右边子...原创 2018-09-01 01:12:08 · 275 阅读 · 0 评论 -
leetcode 100 : 相同的树
题目 算法思想 :因为是一棵树,我们可以采用先序遍历的方式来写,递归写法比较简单,看一看就明白了。 bool isSameTree(TreeNode* p, TreeNode* q) { if(p == NULL || q == NULL) return p == q ? true : false; if(p->val == q->v...原创 2018-09-01 01:12:28 · 96 阅读 · 0 评论 -
leetcode 104: 二叉树的最大深度
题目 算法思想 :dfs的写法比较简单,只需要判断当前节点是否为空,不为空则返回它的下一层节点的高度加一,否则返回0. 另外一种bfs的方法就是一层一层的遍历,为了好处理我们可以定义两个队列,每遍历一层高度加一。这个代码不是很难,这里就不写了。 int maxDepth(TreeNode* root) { int high = 0; if(root == NUL...原创 2018-09-01 01:37:49 · 148 阅读 · 0 评论 -
leetcode 107 : 二叉树的层次遍历
题目算法思想 :明显这道题目考察的是bfs,虽然要求是倒序输出,但是我们的思路还是应该正着走一遍。简单做法就是我们层次遍历直接放进二维数组,用vector自带的reverse函数就可以了,但是本着造轮子的原则,我还是手动把reverse实现了,其中为了方便表示层数,我用pair把treenode和高度减一联系在一起,具体思路参照代码。 vector<vector<int...原创 2018-09-01 15:45:41 · 153 阅读 · 0 评论 -
leetcode 108 :将有序数组转换为二叉搜索树
题目 算法思想 :因为数组是有序的所以我们构造的时候可以保证数组区间[i-j],其中根节点的值是nums[mid],mid = i + (j-i)/2,递归构建就可以了。 TreeNode* init_tree(vector<int>& nums,int l,int r){ TreeNode* root = new TreeNode(0); ...原创 2018-09-01 16:31:24 · 111 阅读 · 0 评论 -
leetcode 110 : 平衡二叉树
题目算法思想 :我们只需要递归的判断每个根节点的左右子树高度是否小于等于1即可。 int maxDepth(TreeNode* root) { int high = 0; if(root == NULL) high = 0; else high = max(maxDepth(root->left),maxDepth(r...原创 2018-09-02 19:04:43 · 170 阅读 · 0 评论 -
leetcode 111 : 二叉树的最小深度
题目算法思想:我们用dfs的思想解决,如果根节点为空返回0,否则若根节点的左右子树都为空则返回1,都不为空则返回最小高度加一。如果一颗子树为空,另一颗子树不为空,则为空的子树的返回值肯定是0,那我们返回另一个不为空子树的高度加一。 int minDepth(TreeNode* root) { if(root == NULL) return 0; if...原创 2018-09-02 19:31:18 · 290 阅读 · 0 评论 -
leetcode 112 : 路径总和
题目 算法思想 :我们采用dfs的思想,如果到达叶子结点且路径和等于sum, 返回true否则都返回false。 bool dfs(TreeNode* root,int rev,int sum){ if(root == NULL) if(rev == sum) return true; else ...原创 2018-09-02 22:12:00 · 152 阅读 · 0 评论 -
leetcode 118 : 杨辉三角
题目给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。 算法思想 :考察基本的循环,i表示行,j表示列,如果j==0 || j== i则为1,否则a[i][j] = a[i-1][j-1] + a[i-1][j]; vector<vector<int>> generate(in...原创 2018-09-02 22:29:04 · 143 阅读 · 0 评论 -
leetcode 119 : 杨辉三角2
题目给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 算法思想 :首先注意的是第k行有k+1个元素,正常解法是用二维数组存储,返回第k行,下面我们用O(k)的空间复杂的求解,我们用一个大小k+1的一位数组来模拟二维数组的操作,为了防止覆盖需要的数据,所以从后往前计算。公式是a[j] = a[j]+a[j-1]. vector<int> g...原创 2018-09-03 00:01:51 · 179 阅读 · 0 评论 -
leetcode 905:按奇偶排序数组
题目描述: 算法思想:开辟一个和A数组一样大小的数组,扫遍一遍,偶数放前面,奇数放后面。或者同时从A数组前后一起扫描,奇偶数交换位置。 代码:vector<int> sortArrayByParity(vector<int>& A) { vector<int> result(A.size()); ...原创 2018-12-26 16:50:13 · 284 阅读 · 2 评论 -
leetcode 832:翻转图像
题目:算法思想:首先把每一个vector反转,然后里面的每一个元素和1异或就可实现0和1互换。 代码:vector<vector<int> > flipAndInvertImage(vector<vector<int> >& A) { for(int i = 0;i < A.size();i++) ...原创 2018-12-26 17:14:52 · 92 阅读 · 2 评论 -
leetcode 922:按奇偶排序数组 II
题目:算法思想:新建一个数组,然后判断插入到合适位置。代码:vector<int> sortArrayByParityII(vector<int>& A) { vector<int > result(A.size()); int m = 0,n = 1; for(int i = 0;i < ...原创 2018-12-27 20:55:07 · 103 阅读 · 0 评论 -
leetcode 771:宝石与石头
题目:算法思想:本来应该是哈希的,但是你会发现运行时间比较大,主要原因是这道题数据比较小,所以我们可以换一种做法。因为都是字符,直接创建一个数组控制ASCII是否出现过,然后查找很方便。 代码:int numJewelsInStones(string J, string S) { vector<bool > a(256); for(int...原创 2018-12-27 21:26:46 · 154 阅读 · 0 评论 -
leetcode 867:转置矩阵
题目:算法思想:result[i][j] = A[j][i],用vector写出来。 代码:vector<vector<int> > transpose(vector<vector<int> >& A) { int row = A.size(); int column = A[0].size()...原创 2018-12-28 00:32:11 · 143 阅读 · 0 评论 -
leetcode 561:数组拆分 I
题目: 算法思想:对数组排个序,然后选择下标为偶数的元素相加。代码:int arrayPairSum(vector<int>& nums) { sort(nums.begin(),nums.end()); int result = 0; for(int i = 0;i < nums.size();i += 2...原创 2018-12-30 19:59:28 · 119 阅读 · 0 评论 -
leetcode 566:重塑矩阵
题目: 算法思想:先判断不同矩阵的元素个数是否和原矩阵相同,然后遍历构造即可。 代码 :vector<vector<int> > matrixReshape(vector<vector<int> >& nums, int r, int c) { if(r * c != nums.size() * num...原创 2018-12-30 20:26:02 · 169 阅读 · 0 评论 -
leetcode 766:托普利茨矩阵
题目:算法思想:只需要从第二行第二列开始,和对角线上一个元素比较即可。代码 :bool isToeplitzMatrix(vector<vector<int> >& matrix) { for(int i = 1;i < matrix.size();i++) for(int j = 1;j < ...原创 2018-12-30 21:32:35 · 178 阅读 · 0 评论 -
leetcode 169:求众数
题目:算法思想:题目中说明一定存在众数且频率不小于n/2,如果是排序,复杂度是O(nlogn),所以我们采用一次遍历。假设第一个数是众数,设置计数器,如果遇到不同的减一,相同的加一,如果计数器变成零,替换成当前元素,最后剩下的肯定是众数,因为题目说了不小于n/2。代码 :int majorityElement(vector<int>& nums) { ...原创 2018-12-30 21:57:02 · 147 阅读 · 0 评论 -
leetcode 303:区域和检索 - 数组不可变
题目:算法思想:动态规划的思想就是把问题分割成子问题,解出子问题的最优然后求出问题的最优解。该题设置一个sum数组,存储的是nums数组从一个元素到当前元素的和,这样就很容易解出i到j的和。代码: vector<int> sum; NumArray(vector<int> nums) { if(nums.size() == 0...原创 2019-03-03 17:10:58 · 114 阅读 · 0 评论