
算法与数据结构
毕业有1000个offer
梦想成为大厂程序猿
展开
-
动态规划经典例题详解
最长回文子序列给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。解题思路运用的是动态规划的思想,由于是求最长回文字符串。dp数组定义为:在子串s[i…j]中,最长回文子序列的长度为dp[i][j];子问题: 所以其子问题可以看作是求短一点长度,例如求dp[i][j],可 以由求其子问题dp[i+1][j-1]的结果算出。所以其子问题即是长度 减去左右两端的字符串的长度。递推公式: dp原创 2021-12-28 17:54:59 · 4446 阅读 · 0 评论 -
动态规划之背包和斐波那契
动态规划动态规划问题的一般形式就是求最值问题。求解动态规划的核心问题是穷举动态规划的穷举有点特别,因为这类问题存在“重叠子问题”,所以可以减少穷举的过程,可以使用备忘录或者dpTable的方法。通常解决动态规划问题要写出状态方程。public class Fib { public static void main(String[] args) { System.out.println(fib(5)); System.out.println(fibMemo原创 2021-12-04 11:18:47 · 286 阅读 · 1 评论 -
递归算法之全排列和汉诺塔和二分搜索
递归算法递归算法是自己调用自己函数的一种形式。递归算法通常包括两个方面:递归出口,一般是可以直接解决问题的地方递归递推式,方便后面自己调用自己。全排列从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。例如:1 、2 、3三个元素的全排列为:{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。思想方法:首先可以将数组的每一个数跟数组首位进行交换,然后原创 2021-12-03 19:04:28 · 563 阅读 · 0 评论 -
计数二进制子串(力扣696题)
思路将所有的字符串连续的数字统计放入集合中集合中相邻的两个最小的即是所需要的子串个数,然后统计总数。class Solution { public int countBinarySubstrings(String s) { List<Integer> counts = new ArrayList<>(); int p = 0; int length = s.length(); while(p <原创 2021-07-29 17:01:31 · 96 阅读 · 0 评论 -
顺序合并两个链表
思路1:创建新链表,同时遍历两个链表,对两个遍历的节点进行对比,谁的值小,就把值小的节点加入到新链表中。然后让此链表结点后移。如果出现null则退出循环,直接将未遍历完的链表直接加入到新链表中。并返回新的头节点。代码 class ListNode { int val; ListNode next; ListNode(int x) { val = x; }} public class Solution { public ListNode mergeTw原创 2021-07-28 11:23:34 · 263 阅读 · 0 评论 -
java双向链表的实现
双向链表的方法package LinkedList;import java.util.Iterator;public class DoubleLinkedListDemo {}class DoubleLinkedList<T>{ private class Node<T>{ public T item; public Node pre; public Node next; public No原创 2021-04-04 10:11:33 · 125 阅读 · 0 评论 -
java队列和链表基础功能实现
数据结构线性结构:数据元素一对一线性关系。常用的数组,队列,链表,栈。非线性结构:二维数组,多维数组,广义表,树,图。存储结构:1:链式存醋,2: 顺序存储。队列**特点:**先进先出。可以用数组和链表实现。...原创 2021-04-03 20:56:29 · 88 阅读 · 0 评论 -
二分查找算法
二分查找原理二分查找是基于对有序列表进行查找的算法。设置两个变量low和high,然后循环,每次减半,让mid=low+(high-low)/2;如果值大于mid指向的数的,则让low=mid+1,如果值小于mid指向的数,则让high=mid-1,找到即返回。import java.util.Arrays;import java.util.Scanner;public class BinarySearch { //二分查找 public static int rank(int k原创 2021-04-01 14:46:37 · 170 阅读 · 1 评论 -
无重复字符的最长子串
一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。解题思路:滑动窗口,双指针遍历,把遍历到的字符存在map中,如果右指针遍历的字符在map中已经存在,则需要左指针往右移动一位。javaScript解法var lengthOfLongestSubstring = function(s) { let l = 0; let res = 0; const map = new Map(); for(let i = 0;i < s.length;i++){原创 2021-03-23 09:58:02 · 88 阅读 · 0 评论 -
有效的括号(力扣20题)
js代码let isValid =(str)=>{ // 传入的长度不等于偶数 if(str.length % 2 !== 0){ return false; } // 遇到左括号则入栈,遇到右括号则判断当前栈顶元素是否是对应左括号,不是则返回false。最后判断栈是否为空。 let stack = []; for(let i = 0; i < str.length;i++){ let current = str[i原创 2021-03-13 00:45:38 · 105 阅读 · 0 评论