算法
算法是编程的核心,程序=数据结构+算法
冲冲冲冲冲冲!!!
互联网行业的农民工,已润去ic了
展开
-
一道比较有意思的算法题
1、一个二维矩阵,矩阵中每个位置有不一样高的柱子,小球只能往高度相同的柱子或者更低的柱子滚动,判断一个小球能否滚落出矩阵(返回值为bool类型,小球可以向右,向下,斜向走)2、给定一个字符串s,和字符串字典strDict,使用strDict中的字符串来组成s,并用|分割......原创 2022-06-08 13:24:07 · 221 阅读 · 0 评论 -
leetcode每日一题:摩尔投票
思路:抓住重点:出现超过一半的元素,可以让两两不一样的元素对消,剩下的一个或多个相同的元素就是所要返回的元素了。原创 2022-06-08 13:22:19 · 69 阅读 · 0 评论 -
Spring IOC
IoC是控制反转的意思,是一种面向对象编程的设计思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高。尤其是在一个大型的项目中,对象与对象之间的关系是十分复杂的,这十分不利于代码的维护。IoC则可以解决这种问题,它可以帮我们维护对象与对象之间的依赖关系,并且降低对象之间的耦合度。说到IoC就不得不说DI,DI是依赖注入的意思,它是IoC实现的实现方式。由于IoC这个词汇比较抽象而DI比较直观,所以很多时候我们就用DI来代替它,在很多时候我们简单地将IoC原创 2021-12-01 01:26:41 · 233 阅读 · 0 评论 -
215. 数组中的第K个最大元素(堆排序忘了,面试翻车。。)
题目:思路:使用堆排序选择,时间复杂度可以达到O(nlogk)(堆排序写法忘了,哭)class Solution { public int findKthLargest(int[] nums, int k) { int heapSize = nums.length; buildMaxHeap(nums, heapSize); for (int i = nums.length - 1; i >= nums.length - k + 1; i原创 2021-11-09 18:05:56 · 94 阅读 · 0 评论 -
翻转链表进阶:k个一组翻转链表(使用迭代的方式)
别被红色的困难两个字吓到了,其实滤清思路后你会觉得真的不难思路如下:例如:可以使用迭代的方式:第一次迭代:21345第二次迭代:23145这一组就翻转完毕,因为剩余节点个数小于k,则这即要返回的结果;拓展一下:head = [1,2,3,4,5,6,7,8]第一次迭代:21345678第二次迭代:32145678第一组翻转完毕;第一次迭代:32154678第二次迭代:32165478剩余节点个数小于k,则这即为要返回的结果;代码实现:/** * Definition fo.原创 2021-08-25 05:01:14 · 87 阅读 · 0 评论 -
贪心算法(leetcode152. 乘积最大子数组)
看到这道题,相信不少人第一反应是动态规划,考虑到负数的出现,偶数个负数相乘必能得到正数,所以要定义两个dp数组,一个保存最小值一个保存最大值,即: public int maxProduct(int[] nums) { /*动态规划*/ int n = nums.length; int max = nums[0],min = nums[0],res = nums[0]; for(int i=1;i<n;i++){ .原创 2021-08-25 04:40:15 · 126 阅读 · 0 评论 -
翻转链表递归解法
思路:递归相当于栈!利用栈的先入后出特性实现代码: if (head == null || head.next == null) { return head; } ListNode p = reverseList(head.next); head.next.next = head; head.next = null; retur.原创 2021-08-23 07:04:08 · 69 阅读 · 0 评论 -
谷歌面试题原题:最长公共子序列
题目:思路解析:可以画个二维表,使用动态规划的思路,这时候很容易就能够得出状态转移方程:dp[i][j] = dp[i-1][j-1] c1==c2;dp[i][j] = max{dp[i-1][j],dp[i][j-1]} c1!=c2;(其中c1和c2是分别指向两个字符串中的字符)答案:class Solution { public int longestCommonSubsequence(String text1, String text2) { int m =原创 2021-08-23 06:24:21 · 92 阅读 · 0 评论 -
NC17 最长回文子串
题目:import java.util.*;public class Solution {public int getLongestPalindrome(String A, int n) { // 第 i 个字符到第 j 个字符是否是回文串 boolean[][] dp = new boolean[n][n]; int max = 0; // 字符串首尾字母长度差 (d = j-i) for (int d = 0; d &l原创 2021-08-21 02:31:48 · 98 阅读 · 0 评论 -
归并排序算法(Java)
归并操作的工作原理如下:第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针超出序列尾将另一序列剩下的所有元素直接复制到合并序列尾算法实现如下:import java.util.Arrays;public class MergeSort { public static void me原创 2021-03-31 19:43:38 · 62 阅读 · 0 评论 -
快速排序算法(Java)
合并排序算法和快速排序算法的比较(Java)合并排序:快速排序:原创 2021-03-31 19:38:04 · 58 阅读 · 0 评论 -
详细分析二分查找算法
假设一张0.001cm的纸可以无限次数折叠,那它折叠多少次的高度可以从地面到达月球?答案是log(3.510^(1000001000*100/0.001)),结果约等于45。这结果是否与你的感觉有所差距?因此,可想而知二分查找算法中,折半查找的思路的效率有多高了。现在我们就来详细讨论下二分查找这个这么牛逼的算法。算法具体思路现在给出一个排序的数组,例如是{1,2,3,4,5,6,7,8,9},如何查找3?class Solution { public int minArray(int[]原创 2021-06-15 18:56:37 · 117 阅读 · 2 评论 -
leetcode经典动态规划题目:518、零钱兑换
动态规划解题思路:1、初始化 dp[0]=1;2、遍历coins,对于其中的每个元素coin,进行如下操作:3、遍历 i 从 coin 到amount,将 dp[i−coin] 的值加到dp[i]。最终得到 dp[amount] 的值即为答案。对应的代码实现:class Solution { public int change(int amount, int[] coins) { int[] dp = new int[amount+1]; dp[0] =.原创 2021-06-10 13:33:38 · 84 阅读 · 0 评论 -
动态规划
例题1:爬楼梯:解题思路:最后一步可能走了一阶或者两阶,两种情况,所以很容易得出递归方程。算法优化:可以采用数组的方式模拟迭代过程,即dp[i] = dp[i-1]+dp[i-2]代码如下:class Solution { public int climbStairs(int n) { if(n==1) return 1; int[] dp = new int[n]; dp[0] = 1; dp[1] = 2;原创 2021-04-29 14:36:01 · 89 阅读 · 0 评论 -
leetcode148:排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?思路:类似于数组中的归并排序/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { th原创 2021-04-15 00:11:31 · 51 阅读 · 0 评论 -
算法分析与设计课程知识点整理
目录 1.绪论部分 2.排序 3.分治 4.搜索 5.贪心 6.动态规划 7.回溯与分支限界 1.绪论部分 2.排序 3.分治 4.搜索 5.贪心 6.动态规划 7.回溯与分支限界 ...转载 2021-04-14 17:02:32 · 274 阅读 · 0 评论 -
二叉树遍历(非递归)
//先序遍历public void preOrderTraverse2(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); TreeNode node = root; while (node != null || !stack.empty()) { if (node != null) { System.out.print原创 2021-04-10 13:28:02 · 82 阅读 · 0 评论 -
面试中遇到的算法题
(leetcode258)各位相加class Solution { public int addDigits(int num){ //用数学归纳法可以知道,num-每个位之和,结果必定位9的倍数,用数学归纳法可以证明,若num不为0和9时,结果必定为num%9 // if(num==0){ // return 0; // } // else if(num%9==0){ // return 9;原创 2021-04-02 17:37:40 · 46 阅读 · 0 评论 -
leetcode765题——情侣牵手
题目N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手。 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起。 一次交换可选择任意两人,让他们站起来交换座位。人和座位用 0 到 2N-1 的整数表示,情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2N-2, 2N-1)。这些情侣的初始座位 row[i] 是由最初始坐在第 i 个座位上的人决定的。示例 1:输入: row = [0, 2, 1, 3]输出: 1解释: 我们只需要交换row[1原创 2021-02-14 14:55:27 · 131 阅读 · 0 评论 -
【leetcode系列】53. 最大子序和
题目最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1] 输出:1示例 3:输入:nums = [0] 输出:0示例 4:输入:nums = [-1] 输出:-1示例 5:输入:nums = [-100000] 输出:-10000原创 2021-03-15 14:31:27 · 91 阅读 · 1 评论 -
leetcode【52. N皇后 II】最牛逼的解法
题目n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。示例 1:输入:n = 4输出:2解释:如上图所示,4 皇后问题存在两个不同的解法。示例 2:输入:n = 1输出:1提示:1 <= n <= 9皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。代码class Solution {public int total原创 2021-03-15 13:40:52 · 95 阅读 · 0 评论