算法思维
- 基础技巧:分治、二分、贪心
- 排序算法:快速排序、归并排序、计数排序
- 搜索算法:回溯、递归、深度优先遍历,广度优先遍历,二叉搜索树等
- 图论:最短路径、最小生成树
- 动态规划:背包问题、最长子序列
动态规划
股票问题
背包问题
回溯
贪心
class Solution {
public int jump(int[] nums) {
int length = nums.length;
int end = 0;
int maxPosition = 0;
int steps = 0;
for (int i = 0; i < length - 1; i++) {
maxPosition = Math.max(maxPosition, i + nums[i]);
if (i == end) {
end = maxPosition;
steps++;
}
}
return steps;
}
}
数据结构
- 数组与链表:单 / 双向链表
- 栈与队列
- 哈希表
- 堆:最大堆 / 最小堆
- 树与图:最近公共祖先、并查集
- 字符串:前缀树(字典树) / 后缀树
链表
栈
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null) return l2;
if(l2==null) return l1;
if(l1.val<l2.val){
l1.next=mergeTwoLists(l1.next,l2);
return l1;
}else{
l2.next=mergeTwoLists(l1, l2.next);
return l2;
}
}
普通栈
private String UnzipString(String records){
String result="";
LinkedList<StringBuilder> stack_res=new LinkedList<>();
int cur_multi=0;
StringBuilder cur=new StringBuilder();
stack_res.push(cur);
for(char record:records.toCharArray()){
if(Character.isAlphabetic(record)) {
stack_res.peek().append(record);
}
if(record=='('){
cur=new StringBuilder();
stack_res.push(cur);
}
if(record==')'){
continue;
}
if(Character.isDigit(record)){
cur_multi=cur_multi*10+record-'0';
}
if(record=='<'){
cur_multi=0;
}
if(record=='>'){
StringBuilder temp=stack_res.pop();
for(int i=0;i<cur_multi;i++){
stack_res.peek().append(temp);
}
}
}
return stack_res.peek().toString();
}
class Solution {
public String reverseParentheses(String s) {
LinkedList<StringBuilder> res_stack=new LinkedList<>();
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
if(Character.isAlphabetic(s.charAt(i))){
sb.append(s.charAt(i));
continue;
}
if(s.charAt(i)=='('){
res_stack.push(sb);
sb=new StringBuilder();
continue;
}
if(s.charAt(i)==')'){
StringBuilder temp=res_stack.pop();
sb=temp.append(sb.reverse());
}
}
return sb.toString();
}
}
单调栈
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
LinkedList<Integer> stack=new LinkedList<>();
int[] result=new int[temperatures.length];
for (int i=0;i< temperatures.length;i++){
while((!stack.isEmpty())&&(temperatures[i]>temperatures[stack.peek()])){
int index=stack.pop();
result[index]=i-index;
}
stack.push(i);
}
return result;
}
}
哈希表
public int divideGroup(int[] tasks, int[][] mutexPairs) {
int result=1;
Map<Integer,Set<Integer>> map=new HashMap<>();
Arrays.stream(tasks).forEach(task->map.put(task,new HashSet<>()));
Arrays.stream(mutexPairs).forEach(ints -> map.get(ints[0]).add(ints[1]));
Set<Integer> curSet=new HashSet<>();
for(int i=0;i< tasks.length;i++){
if(curSet.contains(tasks[i])){
result++;
curSet.clear();
curSet.addAll(map.get(tasks[i]));
}else{
curSet.addAll(map.get(tasks[i]));
}
}
return result;
}
链表
class Solution {
public void reorderList(ListNode head) {
ListNode middle=findMiddle(head);
ListNode head2=reverseList(middle.next);
middle.next=null;
mergeList(head,head2);
}
private ListNode reverseList(ListNode listNode){
ListNode pre=null;
ListNode cur=listNode;
while(cur!=null){
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
private ListNode findMiddle(ListNode listNode){
ListNode slow=listNode;
ListNode fast=listNode;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
public void mergeList(ListNode l1, ListNode l2) {
ListNode l1_tmp;
ListNode l2_tmp;
while (l1 != null && l2 != null) {
l1_tmp = l1.next;
l2_tmp = l2.next;
l1.next = l2;
l1 = l1_tmp;
l2.next = l1;
l2 = l2_tmp;
}
}
}
技巧
前缀树
前缀和
滑动窗口
class Solution {
public int lengthOfLongestSubstring(String s) {
int maxLen=0,r=0;
Set<Character> set=new HashSet<>();
for(int l=0;l<s.length();l++){
set.add(s.charAt(l));
while(set.size()<l-r+1){
if(s.charAt(r)!=s.charAt(l)){
set.remove(s.charAt(r));
}
r++;
}
maxLen=Math.max(maxLen,l-r+1);
}
return maxLen;
}
}
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int min=nums.length;
for(int r=0,l=0;r< nums.length;r++){
while(sum(nums,l,r)>=target){
min=Math.min(min,r-l+1);
l++;
}
}
return sum(nums,0, nums.length-1)<target?0:min;
}
private int sum(int[] nums,int l,int r){
int sum=0;
while(l<=r){
sum=sum+nums[l];
l++;
}
return sum;
}
}