LeetCode第206题Reverse Linked List
Reverse Linked ListReverse Linked List反转单链表。
Example:
Input: 1->2->3->4->5->NULLOutput: 5->4->3->2->1->NULL
我们需要三个指针,prev->curr->next,从头指针开始反转,令curr->prev,完成一个元素的反转之后,令其下一个元素为curr指针指向的对象,直到当前元素curr为空,可以使用遍历或递归的方式来实现。
prev
curr
next
…
null
1
2
…
3
4
5
null
1
2
3
…
4
5
null
2
3
4
…
5
null
3
4
5
…
null
4
5
null
…
Solution下面是Java的代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * List ...
LeetCode第24题Swap Nodes in Pairs
Swap Nodes in PairsSwap Nodes in Pairs给定一个链表,交换两个相邻节点,注意,不能修改列表节点中的值,只能更改节点本身的顺序。
Example
Given 1->2->3->4, you should return the list as 2->1->4->3.
链表的结点交换或反转没有什么特别的地方,就是一把梭。LeeCode已经给我们定义好了结点Node:一个指针,一个结点值,交换函数传入参数的是头指针。当结点数是偶数的时候,没有问题,当结点数是奇数的时候,最后一个结点的下一个结点是Null,就不能交换或反转。
Solution下面是Java的代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution & ...
LeetCode第22题Generate Parentheses
Generate ParenthesesGenerate Parentheses给定一个正整数,生成有效括号的所有组合,这里只需要生成小括号即可。
Example
Input: n = 3Output: [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()”]
可见,当n确定时,生成的解的长度是固定的2n,并且解的开头一定是左括号,如果是右括号则是无效的解,左括号与右括号的数量必定是一样的,都是n个,这些是分析题目要求得到的“先验知识”了,接下来开始Code贝叶斯推断bushi。
怎么办呢,可以用递归或者说深度优先搜索的方法来遍历,每一个解看成一个长度2n的一维数组,我们往里面填充左括号和右括号,起始值都是n个,用掉一个就减去一个。如果当前还有左括号,就使用一个左括号,同时,如果右括号的数量比左括号多,则为左括号匹配一个右括号,直到两者都用完为止。
Solution下面是Java的代码:
class Solution { public List<String> generateParenthe ...
LeetCode第20题Valid Parentheses
Valid ParenthesesValid Parentheses的要求是匹配括号的合法性。
Example 1:
Input: “()”Output: true
Example 2:
Input: “()[]{}”Output: true
Example 3:
Input: “(]”Output: false
解法明天再写,回去洗洗睡先。
方法是使用一个栈的数据结构来匹配括号,我们将每一个元素和三种括号分别进行匹配,如果是“(”那么就往栈里push进一个它的“解”也就是“)”,中括号和大括号也类似,也就是说我们匹配到一个左括号就往栈里push进一个“解”—右括号。
假设当前的括号序列是“()[]{}”,当匹配到第一个元素“(”的时候,栈里面就push进一个“)”,当匹配走到第二个元素“)”的时候,由于它不是待匹配的左括号,而是“解”,所以我们pop栈中的内容,刚好发现栈里面有一个“)”,于是将它pop出去,同理解决余下的元素,最后发现,栈是空的,且所有元素都匹配完了,说明没有非法的括号。如果中途栈就空了,而当前待匹配的不是左括号而是“解”—右括号,则说明 ...
LeetCode第15题Three Sum
Three SumThree Sum和TwoSum属于类似的题目,ThreeSum要求是,给定一个数组和一个目标值,求得数组中a+b+c=0的三个数a,b,c,这里目标数定为了零。
Example:
Given array nums = [-1, 0, 1, 2, -1, -4]
A solution set is:[ [-1, 0, 1], [-1, -1, 2]]
解法如下,首先对数组进行从小到大排序,假定当前这个数nums[i]为a,我们在后面的数中寻找b和c,使得a+b+c=0。记住,我们已经排序过了,所以可以从两头进行夹逼,遍历满足条件的b和c,当a+b+c>0的时候,剩余数的末尾nums[length-1]向左走,当a+b+c<0的时候,剩余数的开头nums[i+1]向右走,。
Solution下面是Java的代码:
class Solution { public static List<List<Integer>> threeSum(int[] nums) { ...
LeetCode第7题Reverse Integer
Reverse IntegerReverse Integer的题目要求很简单,给定32位有符号整数,返回该整数翻转后的结果,结果中零在第一位的省略零。
Example 1:
Input: 123Output: 321
Example 2:
Input: -123Output: -321
Example 3:
Input: 120Output: 21
同样,考虑一个简单粗暴的方法,将整数转换成字符串,将字符串转换成数组,对数组做逆序操作。当然要先判断这个整数的正负,然后考虑翻转后有没有零。
Solution下面是Java的代码:
Class Solution{ public static int reverse(int n) { if (n > Integer.MAX_VALUE || n < Integer.MIN_VALUE) { return 0; } String s = String.valueOf(n); if (n < 0) ...
LeetCode第1题Two Sum
Two SumTwo Sum的题目要求是,给定一个数组和一个目标值,求得数组中两数num1和num2相加等于目标值target的两个数的下标。解法有两种,一是暴力法,一个个比较过来;二是哈希,把数组存在map里,存放的过程中只要发现map里面存有num1对应的目标解num2=target-num1,则返回下标即可。
Solution下面是Java的代码:
class Solution { public int[] twoSum(int[] nums,int target){ int[] result = new int[2]; for (int i = 0; i < nums.length; i++){ for (int j = i + 1;j < nums.length; j++){ if(nums[i] + nums[j] == target){ result[0] = i; ...