随笔分类 - leetcode
leetcode题解
摘要:206th 反转链表 三指针法/迭代 原理:把后一个元素的next指针指向前一个元素。 为什么要引入三个指针: Previous指针:用来记录前一个元素,mid指针将指向它。 Mid指针:用来记录当前需要修改next指针的那个元素,在previous指针的前一位,previous指针在修改完毕后将指
阅读全文
摘要:19th 删除链表的倒数第N个节点 双重循环思路/利用数学特性 倒数第n个数的位置是正数第length - n + 1,我们只需要先数出链表长度,再利用这个特性删除即可。 需要注意的是,如果不对原链表做任何操作的情况下,这样的算法会在首链表失效,(首节点之前再无其他节点用来使用previous.ne
阅读全文
摘要:237th 删除链表中的节点 思考一下就行 趣味题。 因为我们无法拿到node之前的节点previous,因此无法通过previous.next = node.next来删除节点。我们只需要把后面一位的值复制到此位,然后删除后面那位即可。 /** * Definition for singly-li
阅读全文
摘要:8th 字符串转换整数 (atoi) 字符串模式匹配 这种题目极易写出臃肿的代码,我们需要明确具体的条件,并充分考虑细节。(否则会被样例虐爆) 这里有一个常用的判断溢出条件的方法,在之前的题目中也有出现。 对于正数: if(number > Integer.MAX_VALUE / 10 || (nu
阅读全文
摘要:14th 最长公共前缀 暴力模拟/横向扫描 根据题意模拟一遍运行过程即可:先求出第一个和第二个串的最长公共前缀,再以此前缀和第三个串求最长公共前缀… ... 前缀也是一个串的字串,因此要善用string.substring()函数。 class Solution { public String lo
阅读全文
摘要:38th 外观数列 简单模拟 根据题目描述,简单的模拟一遍即可。 class Solution { public String countAndSay(int n) { StringBuilder sb = new StringBuilder("1"); for (int k = 1; k < n;
阅读全文
摘要:28th 实现 strStr() 滑动窗口思想/简单模拟 一个外循环用来遍历大串,一个内循环(或调substring函数)用来比对元素。 class Solution { public int strStr(String haystack, String needle) { int l = need
阅读全文
摘要:125th 验证回文字符串 双指针法 利用双指针逐一对比,遇到不合法字符时跳过。 class Solution { public boolean isPalindrome(String s) { s = s.toLowerCase(); int i = 0, j = s.length() - 1;
阅读全文
摘要:242th 有效的字母异位词 哈希思想 利用哈希表分别统计两个字符串中出现的字母次数,如果满足条件则哈希表中两串的字母出现次数是相同的。 class Solution { public boolean isAnagram(String s, String t) { if(s.length() !=
阅读全文
摘要:387th 字符串中的第一个唯一字符 哈希思想 不重复的字符经过哈希表统计/映射后,其值为1。需要注意的是采用hash table映射后不能按a-z这样的英文字母表顺序查询第一个不重复字符,需要按照字符串原有的顺序线性查找。 class Solution { public int firstUniq
阅读全文
摘要:7th 整数反转 模拟法 利用%运算和/运算,模拟两数反转的过程。难点在于溢出条件的判断(溢出发生于ans = ans * 10 + a阶段),在ans * 10 + a运算完成之前: 对于正数: 当ans大于max_value/10,说明当ans*10后一定溢出。 当ans小于max_value/
阅读全文
摘要:344th 反转字符串 双指针法 双指针法是非常常用的算法,也很容易理解。 class Solution { public void reverseString(char[] s) { int i = 0, j = s.length - 1; while(i <= j) { char t = s[i
阅读全文
摘要:48th 旋转图像 找到变换规则 找到变换前的和变换后的矩阵的转移方程:before[i][j] == after[j][n-i-1] class Solution { public void rotate(int[][] matrix) { int n = matrix.length; int[]
阅读全文
摘要:36th 有效的数独 哈希表思想与二维数组区块(section)的划分 首先,采用哈希表思想保证数字1-9只出现一次。 其次,对于条件1和条件2我们很容易写出对应的hash table并填充好数据,但是对于条件3我们需要将二位数组进行区块拆封。 区块拆封方法: 分析过程:已知原数组容量为9x9,则以
阅读全文
摘要:1th 两数之和 暴力枚举法 直接两重循环暴力枚举,很慢。 class Solution { public int[] twoSum(int[] nums, int target) { int[] ans = new int[2]; for(int i = 0; i < nums.length; i
阅读全文
摘要:283th 移动零 位置指示器法 我们将cnt看作位置指示器,易于发现规律:某个不为0的元素前面有几个0(cnt),他就会向前移动cnt个位置。 class Solution { public void moveZeroes(int[] nums) { int cnt = 0; for(int i
阅读全文
摘要:66th 加一 模拟运算法 根据题目要求做一个模拟即可,需要注意的是最后的数组长度不一定为原数组长度,还可能会增加一位,因为类似于999会进位到1000。因此最后需要做一个判断。 class Solution { public int[] plusOne(int[] digits) { int[]
阅读全文
摘要:350th 两个数组的交集 II 利用指针思想 针对有序的数组,利用指针思想,分别为nums1, nums2数组指定指针i与j。因为数组是有序的,所以在两个指针同时便利两个数组时只会出现三种情况,分别解决它们即可。 这里因为不知道最后它们的交集合长度是多少故易联想到使用List动态添加元素,最后将其
阅读全文
摘要:136th 只出现一次的数字 先排序后处理数据 class Solution { public int singleNumber(int[] nums) { Arrays.sort(nums); boolean flag = false; int ans = 0; for(int i = 0; i
阅读全文
摘要:189th 旋转数组 利用空间特性解题 例如 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 我们会发现,答案数组前端的k个元素,恰好是原数组末端的k个元素。因此我们只需要把原数组拆分为两个数组:head(包含原数组的前nums.length k个元素
阅读全文

浙公网安备 33010602011771号