![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
wmmmyyyyyy
这个作者很懒,什么都没留下…
展开
-
最长回文子串
动归解法: class Solution { public String longestPalindrome(String s) { int n=s.length(); if(n<2) return s; int start=-1; int maxLength=-1; char[] ch=s.toCharArray(); boolean[][] dp=new boolean[n]原创 2021-07-28 14:13:41 · 136 阅读 · 0 评论 -
最长公共子串&子序列
1.子串 import java.util.*; public class Solution { /** * longest common substring * @param str1 string字符串 the string * @param str2 string字符串 the string * @return string字符串 */ public String LCS (String str1, String str2) {原创 2021-07-27 15:22:40 · 103 阅读 · 0 评论 -
设计LRU缓存结构
描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值 [要求] set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。 若opt=1,接下来两个整数x, y,表示set(x, y) 若opt=2,接下来一个整数x,表示get原创 2021-07-25 20:42:49 · 116 阅读 · 0 评论 -
求最长递增子串&子序列
1.最长递增子串 public static int getMax1(int[] arr){ int len=1; int res=0; for(int j=1;j<arr.length;j++){ if(arr[j-1]<arr[j]){ len++; res=Math.max(res,len); }else{原创 2021-07-24 16:15:27 · 148 阅读 · 0 评论 -
7.贪心算法
1.贪心算法概述 贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高。 比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间,如果满足贪心选择性质,那么可以进一步降低时间复杂度,达到线性级别的。 什么是贪心选择性质呢,简单说就是:每一步都做出一个局部最优的选择,最终的结果就是全局最优。注意哦,这是一种特殊性质,其实只有一小部分问题拥有这个性质。 2.举例说明 举例:很经典的贪心算转载 2021-06-27 08:32:10 · 65 阅读 · 0 评论 -
6.BFS算法
问题的本质就是让你在一幅「图」中找到从起点start到终点target的最近距离 框架: // 计算从起点 start 到终点 target 的最近距离 int BFS(Node start, Node target) { Queue<Node> q; // 核心数据结构 Set<Node> visited; // 避免走回头路 q.offer(start); // 将起点加入队列 visited.add(start); int step =转载 2021-06-26 09:59:29 · 97 阅读 · 0 评论 -
5.二叉树遍历框架
这里写目录标题1.前序遍历2.中序遍历3.后序遍历4.层序遍历 1.前序遍历 void traverse(TreeNode root) { if (root == null) return; // 前序遍历的代码 traverse(root.left); traverse(root.right); } 2.中序遍历 void traverse(TreeNode root) { if (root == null) return; traverse(root原创 2021-06-24 19:27:57 · 181 阅读 · 2 评论 -
4.回溯算法
解决一个回溯问题,实际上就是一个决策树的遍历过程。 你只需要思考 3 个问题: 1、**路径:**也就是已经做出的选择。 2、**选择列表:**也就是你当前可以做的选择。 3、**结束条件:**也就是到达决策树底层,无法再做选择的条件。 回溯算法的框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择原创 2021-06-15 09:06:12 · 87 阅读 · 0 评论 -
3.滑动窗口算法
一、滑动窗口算法的代码框架 /* 滑动窗口算法框架 */ void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移入窗口的字转载 2021-06-13 08:46:50 · 120 阅读 · 0 评论 -
2.双指针
1.快慢指针 主要解决链表中的问题,比如典型的判定链表中是否包含环 解决的问题包括: (1)判定链表中是否含有环 经典解法就是用两个指针,一个每次前进两步,一个每次前进一步。 如果不含有环,跑得快的那个指针最终会遇到 null,说明链表不含环;如果含有环,快指针最终会超慢指针一圈,和慢指针相遇,说明链表含有环。 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next;原创 2021-06-10 16:13:29 · 53 阅读 · 0 评论 -
1.二分查找(用于有序数组)
1.基本的二分搜索(查找一个数) (1)写法1:包含右边界 int binary_search(int[] nums, int target) { int left = 0, right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1原创 2021-06-10 09:09:57 · 88 阅读 · 0 评论 -
每日刷题-->数组
1.使用hashset class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> set=new HashSet<>(); for(int i:nums){ if(!set.contains(i)){ set.add(i); }else{ retu原创 2021-05-23 22:01:56 · 51 阅读 · 0 评论 -
设计数据结构
1.Union-Find 算法 图论 class Solution { public boolean equationsPossible(String[] equations) { //使用图论,先用相等式在相等字符之间建立联通,然后再判断不等式是否破坏之前的联通 //如果破坏,返回false;否则返回true UF uf=new UF(26); for(String eq:equations){ if(eq.原创 2021-05-21 19:14:34 · 345 阅读 · 0 评论 -
算法-数学运算技巧
(1)如何用算法高效寻找素数? class Solution { public int countPrimes(int n) { boolean[] isPrim=new boolean[n]; Arrays.fill(isPrim,true); //优化1:只需要判断到sqrt(n)就能知道是否为质数 for(int i=2;i*i<n;i++){ if(isPrim[i]){原创 2021-05-20 17:27:36 · 184 阅读 · 0 评论 -
算法-回文问题
1.回文串 (1)让字符串成为回文串的最小插入次数–动归 class Solution { public int minInsertions(String s) { int n=s.length(); int[][] dp=new int[n][n]; dp[0][0]=0; for(int i=n-2;i>=0;i--){ for(int j=i+1;j<n;j++){原创 2021-05-17 17:21:53 · 175 阅读 · 0 评论 -
算法-动态规划-打家劫舍系列
(1)一维数组 class Solution { public int rob(int[] nums) { //状态:房屋位置索引i //dp[i]:到第i个房屋时小偷兜里的最大金额 int n=nums.length; if(n==0) return 0; int[] dp=new int[n+2]; //这个屋偷,下个屋不能偷;这个屋不偷,下个屋可以偷可以不偷 for(int i=n原创 2021-05-17 14:36:38 · 139 阅读 · 0 评论 -
算法-动态规划-股票买卖问题
1.股票买卖问题 (1)交易次数k为1 买入和卖出各算一次操作 class Solution { public int maxProfit(int[] prices) { int n=prices.length; int k=2; int[][][] dp=new int[n][k+1][2]; //base case for(int i=0;i<n;i++){ dp[i][0][0]=0原创 2021-05-17 10:43:10 · 458 阅读 · 0 评论