![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
lintcode
当幸福来敲门1
仲夏夜,星之空, 年少轻狂挽如风
展开
-
A + B 问题
基础java运算符: ^: 异或运算符&: 与运算符~:运算符|: 运算符思想对于 5 + 3 来说: 5的二进制是:a = 101 ; 3 二进制是 b = 011我们可以通过下面的方法得到:101 ^ 011 = 110(101 & 011) << 1 = 010110 ^ 010 = 100(110 & 010) <<1 = 100100 ^ 100 = 000原创 2017-12-20 11:48:32 · 431 阅读 · 0 评论 -
主元素 II
思路本题主要考察的是map数组的使用,唯一的小技巧是在往map中添加元素的时候,时刻的判断着 某个元素的数量是否超过总数的的 1/3代码public int majorityNumber(List nums) { Map hash = new HashMap(); Integer temp, count; for (int i =原创 2018-01-30 09:44:18 · 115 阅读 · 0 评论 -
最长上升子序列
思路这道题考察的是 动态规划 , 这道题的思路和最大子段和是一样的,曾经都写过最长上升子序列,动态规划的方程 可以见参考代码 public int longestIncreasingSubsequence(int[] nums) { int[] len = new int[nums.length]; if (nums.leng原创 2018-01-30 15:45:10 · 161 阅读 · 0 评论 -
三数之和
思路感觉这道题自己的思路还是比较low的,感觉在效率上一点都不高。没想到居然通过了(0.0)。 简单记录下这道题使用了两个小知识: 首先是降低复杂度,首先对于(i, j)和(j, i)是 不允许出现的。所以在for 循环中使用 j < i 避免这种情况; 其次,结果中一定还存在重复元,这时候使用 set 来去除重复元。对于找到的三个数 a+ b + c = 0; 首先将 abc 进行排序,然原创 2018-02-06 14:36:12 · 1034 阅读 · 0 评论 -
搜索二维矩阵 II
思路其实总的思想就是二分查找,但是其中的一个技巧是当查找不到的时候返回 right 值,这时间的 right 值指向值的特性是 a[right] < target其次需要注意的是一定要处理好 边界条件 和特殊的 测试值代码 public static int searchMatrix(int[][] matrix, int target) { if ...原创 2018-04-02 17:21:39 · 128 阅读 · 0 评论 -
最小子串覆盖
思路这道题 lintcode 上面描述的不完整,应该是找到的子串同时满足开始 index 和 length最小核心思想就是使用两个数组 sCount 和 tCount 来记录已经出现的字符的个数,同时使用一个变量 count 已经符合 target 中字母的个数同时一个经典之处是, 使用 while 循环缩小窗口的左边界 代码 public static Strin...原创 2018-04-03 11:06:01 · 149 阅读 · 0 评论 -
落单的数 II
思路:整体的一个思路就是对 n 个数所有的位求和,然后 在对每一个位上的 sum mod 3 ,这样就能够把单独的那个数字找出来代码:public int singleNumberII(int[] A) { int result = 0; for (int i = 0; i < 32; i++) { int coun...原创 2018-04-20 23:11:13 · 124 阅读 · 0 评论 -
53. 翻转字符串
思路首先翻转字符串整体,然后对于每个单词进行翻转,两次翻转的函数使用同一个函数。翻转函数的思路:使用队列将String转成char[],然后反过来存储(下面就是使用的这种方法)用两个指针,进行前后字符的对换代码 public static String reverseWords(String s) { if (s.length() &lt;= 1)...原创 2018-06-05 14:45:31 · 208 阅读 · 0 评论 -
k数和
思路这道题感觉是一个非常好的动态规划的题目,动态规划方程:d[i][j][target]=d[i−1][j][target]+d[i−1][j−1][target−a[i]]d[i][j][target]=d[i−1][j][target]+d[i−1][j−1][target−a[i]]d[i][j][target] = d[i-1][j][target] + d[i-1][j-1][tar...原创 2018-06-07 22:17:40 · 410 阅读 · 0 评论 -
恢复旋转排序数组
思路这道题应该首先计算出来 每个数字到其 原位置 移动的距离。但是有一个陷阱是,当使用程序移动的 时候,有时间遇见 1, 3, 5 只是在几个数之间交换的情形(死循环),所以要保证程序能够跳的出来。代码public void recoverRotatedSortedArray(List nums) { int temp = nums.get(0);原创 2018-01-15 21:27:23 · 125 阅读 · 0 评论 -
翻转链表
思想其实就是设置两个指针 pointer1, pointer2 。同步的移动pointer1, pointer2 ,head 这3个指针。这 3 个指针的前后顺序刚好是pointer1, pointer2 ,head。这道题应该注意的是while循环的判断条件: pointer2 != null代码 public ListNode reverse(ListNode hea原创 2018-01-15 19:37:46 · 125 阅读 · 0 评论 -
丑数 II
思路我们可以首先写出前几个丑数作为种子,比如 array = [1, 2, 3, 4, 5],这是前5个丑数,我们如何确定第6个呢? 第六个丑数,一定是 value2=min(array[i]∗2),value3=min(array[i]∗3),value5=min(array[i]∗5)value2=min(array[i] *2), value3=min(array[i] * 3),value原创 2017-12-20 12:02:42 · 130 阅读 · 0 评论 -
二分查找
思路二分查找的变形,主要的难点在于不仅要找到目标元素,并且要找到下标最小的。可以按照二分查找找到等于目标元素的下标,然后往前遍历,直到找到最小的下标。这里需要注意的是:当找到0下标的元素时候,不能往前面迭代了,因为会导致数组越界代码 public static int binarySearch(int[] nums, int target) { int begin = 0原创 2017-12-22 18:56:24 · 101 阅读 · 0 评论 -
全排列
思路一直认为全排列是一个很经典的问题,从前都实现过一次,这次又做了一次。具体思路,下面链接注意的地方:在java中都是值传递,所以对于swap(a, b)函数的使用,一定要注意,在此处是需要改变数组的内容的,所以需要返回数组函数代码static List<List<Integer>> list = new LinkedList<List<Integer>>(); public List原创 2017-12-22 19:40:06 · 197 阅读 · 0 评论 -
带重复元素的排列
思路这道题感觉考察就是全排列,只是存储的时候使用Set存储,就能防止重复元素做完本题的感悟是:一定要掌握好java的容器,同时感觉自己对于容器的遍历掌握的不好代码static List<List<Integer>> list = new LinkedList<List<Integer>>(); static Set<List<Integer>> set = new HashSet<Li原创 2017-12-22 20:13:15 · 282 阅读 · 0 评论 -
平面列表
思路这道题是比较简单的题,简单的考察下递归的使用代码 private List<Integer> list = new ArrayList<Integer>(); // @param nestedList a list of NestedInteger // @return a list of integer public List<Integer> flatten(Li原创 2017-12-26 15:10:04 · 183 阅读 · 0 评论 -
交叉字符串
思路这道题开始考察了尝试了两个思路,这道题不能简单的从相同的字母的个数是否相等下手。应该要想到字幕出现的顺序。最后使用了递归,但是一直感觉代码的效率不高代码 String s1; String s2; String s3; String s4; public Boolean flag = false; public boolean isInterle原创 2017-12-28 22:56:59 · 196 阅读 · 0 评论 -
插入区间
思路这道题本来以为没什么问题的,但是,真正实现起来,还是感到有点乱。这道题的收获: ArrayList是有序的list中有add(pos, object)方法,就是在指定位置处插入元素代码public List<Interval> insert(List<Interval> intervals, Interval newInterval) { List<Interval> l原创 2017-12-29 10:28:09 · 265 阅读 · 0 评论 -
数组划分
思路这道题没什么考察点,主要是要注意两个for循环,一定要加上pos1 < pos2 防止越界。同时,注意题中最后的要求,如果都比k小,则返回数组的长度。代码public static int partitionArray(int[] nums, int k) { // write your code here int pos1 = 0;原创 2017-12-29 10:53:40 · 148 阅读 · 0 评论 -
50. 数组剔除元素后的乘积
思路这道题使用的是分治法, result[i] = left[i-1] + right[i+1];下面使用巧妙的实现代码public static List<Long> productExcludeItself(List<Integer> nums) { Long temp = Long.parseLong("1"); ...原创 2018-06-02 10:58:24 · 201 阅读 · 0 评论