算法
茹果_遇见T
学生
展开
-
算法-leetcode-每日一题-给出数组中和为target的索引(该数组为升序数组)
给出一个按升序排列的数组,返回两个索引,这两个索引对应的数字和为一个特定的值假定上述问题只有一个解决方案,并且只能遍历数组一次Example:Input: numbers = [2,7,11,15], target = 9Output: [1,2]Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2....原创 2019-03-13 21:13:23 · 671 阅读 · 0 评论 -
算法-leetcode-每日一题-求数组中两两相加等于20的组合
分析:对数组先进行排序,时间复杂度为nlogn,然后用两个指针,一个begin,另一个end。前者不断增加,后者不断减少,在这个过程中比较,时间复杂度为n,则平均时间复杂度为nlongn。public static void findSum(int[] a, int sum) { Arrays.sort(a); int begin = 0; int end = a.len...原创 2019-03-18 10:45:48 · 506 阅读 · 0 评论 -
算法-leetcode-每日一题-求最大子数组
分析:该题是一道经典的题,但是很多人理解不了,我在此处进行了总结,大家按我的思路看下去,肯定能理解。使用蛮力法。最外循环为第i个数,第二循环从i开始一直到数组尾j,最内循环则计算i到j子数组的和。public static int maxSubArray(int arr[]) { int n = arr.length; int ThisSum = 0, MaxSum = 0...原创 2019-03-18 10:04:01 · 611 阅读 · 0 评论 -
算法-leetcode-每日一题-快速幂
分析:A的n次方,将n看成二进制!例如n为5,二进制101。看下图。所以每一次都要消耗一个二进制位,而且要用一个数字来保存当前二进制位累乘的值。public static void questPos(int a, int n) { int base = a;//base用来保存当前二进制位的累乘值 int res = 1; while(n != 0) { ...原创 2019-03-16 20:00:28 · 313 阅读 · 0 评论 -
算法-leetcode-每日一题-求二进制中1的个数
分析:判断当前数的二进制是否只包含一位1,例如num=00010000,那么num-1的二进制表示为00001111,num&(num-1)的结果必须为0。根据这个想法每次消除1个1就能解public static int count(int num) { int count = 0; while (num != 0) {//注意这里!一定是!=0,注意负数的情况 ...原创 2019-03-16 19:58:04 · 509 阅读 · 0 评论 -
算法-leetcode-每日一题-判断一个数是否为2的n次方
分析:两种思路,一种对1做左移操作,然后判断是否跟给定数相同。该时间复杂度为logn。另一种,判断当前数的二进制是否只包含一位1,例如num=00010000,那么num-1的二进制表示为00001111,num&(num-1)的结果必须为0public static boolean isPower(int n) { if(n < 1) { return f...原创 2019-03-16 17:06:00 · 717 阅读 · 0 评论 -
算法-leetcode-每日一题-在不知道头指针的情况下删除链表指定结点
分析:该题分为2种情况:1. 如果删除的节点为链表尾节点,则无法删除,因为删除后无法使其前面节点的next为null。2. 如果不是,则可以通过交换这个节点与其后继节点的值,然后删除后继节点。public boolean deleteNode(Node n) { if(n == null || n.next == null) { return false; }...原创 2019-03-16 16:15:15 · 318 阅读 · 0 评论 -
算法-leetcode-每日一题-链表环的入口点
分析:该题本质上分解为2个题,一个是判断一个链表是否有环,另一个则寻找环的入口点。如何判断一个链表有环,相信很多人都知道:定义两个指针fast和slow,慢指针一次走一步,快指针一次走两步。没走一次快指针都要跟慢指针比较,知道快指针等于慢指针为止,就证明有环。但是为什么这样就能判断链表有环可能很多人就不知道了。其实这是数学归纳法:首先,由于链表是个环,所以相遇的过程可以看作是快指针从后边追赶慢...原创 2019-03-16 16:06:56 · 570 阅读 · 0 评论 -
算法-leetcode-每日一题-从尾输出链表
分析:从尾就有两种思路,一种就是用栈,用栈将链表所有节点存入,然后在输出,另一种就是递归,这里给出递归的思路。public static void printNodeReversely(Node x) { if(x != null) { printNodeReversely(x.next); System.out.println(x); }}...原创 2019-03-16 11:04:13 · 140 阅读 · 0 评论 -
算法-leetcode-每日一题-实现链表反转
分析:直接上代码public static Node reverseNode(Node x) { Node reversedHead = x; Node cur = x; //当前链表的指针 Node pre = null; //用于保存上一个节点的指针 while (cur != null) { Node next = cur.ne...原创 2019-03-16 10:58:04 · 143 阅读 · 0 评论 -
算法-leetcode-每日一题-删除有序链表重复元素
分析:本题有两种解法,第一种直接上代码,用空间换时间public static Node deleteDup1(Node x) { if(x == null || x.next == null) { return x; } Map<Integer, Integer> map = new HashMap<&g...原创 2019-03-15 21:45:33 · 446 阅读 · 0 评论 -
算法-leetcode-每日一题-合并两个有序链表
合并两个有序链表Example:Input: 1->2->4, 1->3->4Output: 1->1->2->3->4->4 public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }...原创 2019-03-13 21:58:08 · 233 阅读 · 0 评论 -
算法-leetcode-每日一题-最大公约数
分析:求最大公约数要知道以下问题:假设有两个数a和b,其中a是不小于b的数,记a被b除的余数为r,则a = b*q + r。假设a和b的一个约数为u,那么a和b都能被u整除,则a = su b = tu,s和t都是整数。r = a - bq = su - (tu)q = (s - tq)u,所以r也能被u整除所以a和b的任一约数同时也是r的约数(每次取余,直到余数为0)。*...原创 2019-03-13 21:38:50 · 3908 阅读 · 2 评论 -
算法-leetcode-每日一题-对称字符串
Example 1:Input: “()”Output: trueExample 2:Input: “()[]{}”Output: trueExample 3:Input: “(]”Output: falseExample 4:Input: “([)]”Output: falseExample 5:Input: “{[]}”Output: true分析:这种对称性问题...原创 2019-03-13 21:37:10 · 631 阅读 · 0 评论 -
算法-leetcode-每日一题-最长前缀
Example 1:Input: [“flower”,“flow”,“flight”]Output: “fl”Example 2:Input: [“dog”,“racecar”,“car”]Output: “”Explanation: There is no common prefix among the input strings.分析:本题直接上代码,看代码更清晰。public...原创 2019-03-15 19:32:12 · 155 阅读 · 0 评论 -
算法-leetcode-每日一题-判断一个整数是否是回文
**Example 1:Input: 121Output: trueExample 2:Input: -121Output: falseExplanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.Example...原创 2019-03-13 21:26:58 · 339 阅读 · 0 评论 -
算法-leetcode-每日一题-颠倒数字
Example 1:Input: 123Output: 321Example 2:Input: -123Output: -321Example 3:Input: 120Output: 21如果颠倒后的数字超过Integer长度则返回0分析:看到数字颠倒,一定要想到取余和除法。 public int reverse(int x) { if (x == 0...原创 2019-03-13 21:21:26 · 434 阅读 · 0 评论 -
算法-leetcode-每日一题-给出数组中和为target的索引
给出一个整数数组,返回两个索引,这两个索引对应的数字和为一个特定的值。假定上述问题只有一个解决方案,并且只能遍历数组一次Example:Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].分析:这种问题一定要想到用空间换时间,必须定义一个辅助的数据结构进行存...原创 2019-03-13 20:46:53 · 603 阅读 · 0 评论