
算法
算法
wenyixicodedog
文一西路代码狗
展开
-
1000个苹果要分到10个箱子中去 两种分析方式
前些日子接到了一个Java开发的电话面试,接了电话人家开门见山就直接说现在是否方便,什么什么时候收到您的简历投递,是否可以进行电话面试,如果可以就可以直接开始了,emmm,这么突然,也没好意思问公司名称是啥,招的是中级还是高级,算了,直接上车吧,心里想着面试结束了问问公司名称,然后去招聘网站上查下招聘职位,一共面试了大概一个半小时,面试快结束的时候聊一些其他的才知道人家招的是Java高级开发。面试问了好多,从数据结构到算法,从框架源码到系统设计,从javaSE基础到多线程、某些业务场景下解决高并发等等.原创 2020-08-01 01:24:05 · 5401 阅读 · 3 评论 -
数据结构和算法 之 LinkedHashMap实现LRU算法
目录 1、背景介绍 2、LinkHashMap实现 3、LinkHashMap实现原理一、背景介绍LRU全称是Least Recently Used,即最近最久未使用的意思。LRU算法的主要思想:设置一个缓存大小阈值,超过阈值就去删除最老的数据。新添加数据或者访问数据的时候保证最老的数据总是在链表的头部,最新的数据总是在尾部,这样每次需要删除数据时把头部数据删除即可。二、LinkHashMap实现...原创 2020-07-30 00:47:07 · 543 阅读 · 0 评论 -
数据结构和算法 之 两种方式实现TOP K
目录 1、背景介绍 2、Redis实现 3、PriorityQueue实现一、背景介绍什么是 Top K 问题?简单来说就是在一堆数据里面找到前 K 大(也可以是前 K 小)的数。这个问题也是十分经典的算法问题,不论是面试中还是实际开发中,都非常具有代表性。既然是要查询前 K 大的数,那么最容易想到的方法就是进行排序了,通过如...原创 2020-07-30 00:44:03 · 708 阅读 · 0 评论 -
数据结构和算法 之 手动实现归并排序(稳定排序O(nlogn))及原理分析
算法介绍归并排序(MERGE-SORT)是利用分而治之的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。归并排序由冯·诺依曼提出,是一种稳定、通用的排序算法求解策略。归并示例归指的是利用递归将原数组每次进行二分,分解为两个子数组。并指的是将两个有序序列合并成一个有序序列的方法。如设有数列{13, 121, -12, 14, 34, -23, 87, -87, .原创 2020-07-24 22:26:36 · 605 阅读 · 0 评论 -
数据结构和算法 之 最大子数组之和五种优化(O(n^3)->O(n))
目录1、背景介绍2、蛮力枚举法(O(n^3))3、优化的蛮力枚举法(O(n^2))4、分而治之算法(O(nlogn))5、一般动态规划算法(O(n))6、优化的动态规划(O(n))一、背景介绍所谓最大子数组问题(maximum subarray problem),指的是给定一个数组Arr,计算Arr的非空连续子数组最大值。比如,数组 Arr = {133, 121, -12, 14, 534, -23, 87, -87, 81, 41},最大子数组应为[13 121 .原创 2020-07-17 16:53:18 · 1268 阅读 · 0 评论 -
三角形最小路径和(贪心算法)--leecode
public int minimumTotalGreed(List<List<Integer>> triangle) { int sum = triangle.get(0).get(0); int m = 0, n = 0; for (int i = 1; i < triangle.size(); i++) { int bottom = triangle.get(m + 1).get(n); ...原创 2020-05-16 21:45:04 · 401 阅读 · 0 评论 -
快速排序算法--固定主元( O(n) - O(n ^ 2))
/** * @Date: 2020-03-24 * @Description: 快速排序算法(选取一个数为基数 , 比他大的总是在右边 , 小的总是在左边) * @Description: 时间复杂度好的情况下为O(n), 坏的情况下为O(n ^ 2) */ public static void quickSort(int a[], int low, int high) { if (low >= high) { .原创 2020-05-15 22:45:40 · 313 阅读 · 0 评论 -
快速排序算法--随机主元( O(nlogn))
/** * @Date: 2020-03-24 * @Description: 快速排序算法(随机选取一个数为基数 , 比他大的总是在右边 , 小的总是在左边) * @Description: 时间复杂度为O(nlogn) */ public static void quickSortRandom(int a[], int low, int high) { if (low >= high) { return; .原创 2020-05-15 22:45:49 · 703 阅读 · 0 评论 -
最大子数组之和--分治法( O(nlogn))
/** * @Date: 2020-03-24 * @Description: 最大子数组问题算法(分治法 、 无左右下标) */ public static int maxSubArraySort(int a[], int low, int high) { if (low > high) { return 0; } if (low == high) { return.原创 2020-05-15 22:46:21 · 292 阅读 · 0 评论 -
最大子数组之和--进一步优化的动态规划
/** * 进一步优化的动态规划 * 为了进一步降低空间复杂度,我们可以定义两个变量用来保存方法三中的 * End[i-1]和All[i-1] */ private static void getSumOfSubArray04(int array[]) { int n = array.length; int nEnd = array[0]; //前i个元素的最大子数组之和 int nAll = array[0].原创 2020-05-15 22:46:31 · 150 阅读 · 0 评论 -
最大子数组之和--优化的动态规划(舍弃All数组)
/** * 优化的动态规划(舍弃All数组) */ private static void getSumOfSubArray05(int array[]) { int n = array.length; int End[] = new int[n]; //初始化:当数组中只有一个元素时 End[0] = array[0]; End[n - 1] = array[n - 1]; ...原创 2020-05-15 22:46:41 · 141 阅读 · 0 评论 -
最大子数组之和--动态规划( O(n))
/** * 利用动态规划解题:该方法时间复杂度为:o(n),但是额外使用了两个数组空间,其空间复杂度为:o(n) * 解题思路:对于一个数组,求最大子数组之和,我们可以分为三部分: * 我们以最后一个元素array[n-1]为例子: * 1:array[n-1]自己构成最大的子数组 * 2:包含array[n-1]的最大子数组,即以array[n-1]结尾,我们用End[n-1]表示 * 3:不包含array[n-1]的最大子数组,那么求arra.原创 2020-05-15 22:46:51 · 380 阅读 · 0 评论 -
最大子数组之和--优化的蛮力枚举( O(n^2))
/** * 最大子数组问题算法(优化的蛮力法)(重复利用已经计算的子数组和,相比较方法一,时间复杂度为:O(n^2)) */ private static void getSumOfSubArray02(int array[]) { int n = array.length; int thisSum, maxSum = Integer.MIN_VALUE, i, j; for (i = 0; i < n; i++) { .原创 2020-05-15 22:46:03 · 717 阅读 · 2 评论 -
最大子数组之和(蛮力法 O(n^3))
/** * 最大子数组问题算法(蛮力法 O(n^3)) */ private static void getSumOfSubArray01(int array[]) { int n = array.length; int thisSum, maxSum = Integer.MIN_VALUE, k, i, j; for (i = 0; i < n; i++) { for (j = i; j < .原创 2020-05-15 22:46:13 · 401 阅读 · 0 评论 -
归并排序算法
public static int[] mergeSort(int a[], int low, int high) { int mid = (low + high) / 2; if (low < high) { mergeSort(a, low, mid); mergeSort(a, mid + 1, high); merge(a, low, mid, high); } ...原创 2020-05-14 00:50:43 · 152 阅读 · 0 评论 -
选择排序算法
public static void selectSort(int[] a) { int i, j; int n = a.length; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (a[j] <= a[i]) { a[i] = a[i] + a[j]; ...原创 2020-05-14 00:50:03 · 179 阅读 · 0 评论 -
插入排序算法
public static void insertSort(int[] arr) { int i, j; int n = arr.length; int target; for (i = 1; i < n; i++) { j = i; target = arr[i]; while (j > 0 && target < arr[j ...原创 2020-05-14 00:49:27 · 135 阅读 · 0 评论 -
冒泡排序算法
/** * @Date: 2020-03-23 * @Description: 冒泡排序算法 */ public static void maoPaoSort(int[] a) { for (int i = 0; i < a.length - 1; i++) { for (int j = 0; j < a.length - 1 - i; j++) { if (a[j] >...原创 2020-05-14 00:48:35 · 134 阅读 · 0 评论 -
最长公共子串问题--动态规划
/** * @Date: 2020-03-30 * @Description: 最长公共子串问题 */ public static void longestCommonSubstring(char[] A, char[] B) { int n = A.length; int m = B.length; int[][] C = new int[n + 1][m + 1]; int lMax = 0, pMa.原创 2020-05-14 00:30:03 · 254 阅读 · 0 评论 -
最长公共子序列问题--动态规划
/** * @Date: 2020-03-30 * @Description: 最长公共子序列问题 */ public static void longestCommonSubSequence(char[] A, char[] B) { int n = A.length; int m = B.length; int[][] C = new int[n + 1][m + 1]; int[][] Rec = .原创 2020-05-14 00:28:40 · 208 阅读 · 0 评论 -
二叉树的最近公共祖先(java)--leecode
递归方法求解: public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {原创 2020-05-14 00:19:38 · 166 阅读 · 0 评论 -
合并K个排序链表--leecode
优先队列解法:public static ListNode mergeKLists2(ListNode[] lists) { if (lists == null || lists.length == 0) return null; // 1. 初始化小根堆 PriorityQueue<ListNode> queue = new PriorityQueue((Comparator<ListNode>) (o1, o2) ->转载 2020-05-13 00:26:22 · 89 阅读 · 0 评论 -
合并2个排序链表--leecode
递归求解: public static ListNode mergeTwoListNode(ListNode l1, ListNode l2) { if (l1 == null || l2 == null) { return (l1 == null) ? l2 : l1; } if (l1.val <= l2.val) { l1.next = mergeTwoListNode(l1.next,原创 2020-05-12 23:23:25 · 148 阅读 · 0 评论 -
数组中的第K个最大元素--leecode 分治算法求解
public static int findKthLargest(int[] nums, int k) { if (nums == null || nums.length == 0) { return 0; } //将第K个最大元素转换为第l个最小元素 int l = nums.length + 1 - k; return findKthLargestWithIndex(nums, 0, nums.le.原创 2020-05-08 22:20:59 · 417 阅读 · 0 评论 -
计数质数(统计所有小于非负整数 n 的质数的数量【n为100以内】)
public static int countPrimes(int n) { if (n == 1) return 0; if (n == 2) return 0; if (n == 3) return 1; if (n == 4) return 2; if (n == 5) return 2; if (n == 6) return 3; if (n == 7) return 3; ...原创 2020-05-08 22:16:34 · 266 阅读 · 0 评论 -
打家劫舍--leecode 动态规划
public static int rob(int[] nums) { if (nums == null) { return 0; } int n = nums.length; if (n == 0) { return nums[0]; } int[] C = new int[n]; for (int i = 0; i < n; i+...原创 2020-05-08 22:15:21 · 166 阅读 · 0 评论 -
买卖股票的最佳时机—leecode(可以多次交易—贪心算法)
public static int maxProfit2(int[] prices) { if (prices == null || prices.length == 0 || prices.length == 1) { return 0; } int gap = 0; int profit = 0; for (int i = 0; i < prices.length; i++) { ...原创 2020-05-08 22:14:20 · 344 阅读 · 0 评论 -
买卖股票的最佳时机—leecode(可以1次交易—贪心算法)
public int maxProfit1(int[] prices) { if (prices.length == 0) return 0; int minNum = prices[0]; int index = 0; int earn = 0; for (int i = 1; i < prices.length; i++) { if (prices[i] <...原创 2020-05-08 22:13:26 · 153 阅读 · 0 评论 -
twoSum—leecode
public static int[] twoSum01(int[] nums, int target) { if (nums == null || nums.length == 0) { return null; } int n = a.length; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; ...原创 2020-05-08 22:11:11 · 127 阅读 · 0 评论 -
最长连续序列-leecode—动态规划
动态规划解法: public static int longestConsecutive(int[] nums) { if (nums == null || nums.length == 0) { return 0; } if (nums.length == 1) { return nums...原创 2020-05-05 01:15:08 · 188 阅读 · 0 评论 -
第K个最大元素-leecode—分治法求解
分治法求解第k大/小元素:public int findKthLargest(int[] nums, int k) { if (nums == null || nums.length == 0) { return 0; } //将第K个最大元素转换为第l个最小元素 int l = nums.length ...原创 2020-05-04 16:16:56 · 515 阅读 · 0 评论 -
最长连续递增序列-leecode—分治法、动态规划
第一种方法:双指针枚举法 public static int findLengthOfLCIS1(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int n = nums.length; int maxLength ...原创 2020-05-04 00:27:09 · 334 阅读 · 0 评论 -
翻转字符串里的单词-leecode
第一种方法:使用栈 public static String reverseWords(String s) { s = s.trim(); if (s == null || s.length() == 0) { return ""; } String allStr = ""; /...原创 2020-05-02 18:05:02 · 149 阅读 · 0 评论 -
打家劫舍-leetcode—动态规划
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 ...原创 2020-04-24 00:06:02 · 156 阅读 · 0 评论 -
判断一个数为奇偶数的三种方法
1、传统的利用取余进行判断if (n % 2 == 1) { //n为奇数}if (n % 2 == 0) { //n为奇数}2、利用位运算&进行判断if((n & 1) == 1){ // n 是个奇数。}if((n & 1) == 0){ // n 是个偶数。}3、利用异或运算^进行判断if (1 ^...原创 2020-04-15 01:00:01 · 24492 阅读 · 2 评论 -
双基准快速排序--Java
/** * @Date: 2020-04-13 * @Description: 双基准快速排序--选取 A[left], A[right] 两个数为主元 */ public static void dualPivotQuickSort(int[] A, int left, int right) { if (right - left >...原创 2020-04-13 23:20:48 · 403 阅读 · 0 评论