学习算法
今天又是快乐的一天
不可能再学java了的
展开
-
东哥教你几招常用的位运算技巧
几个有趣的位操作 利用或操作 | 和空格将英文字符转换为小写 ('a' | ' ') = 'a' ('A' | ' ') = 'a' 利用与操作 & 和下划线将英文字符转换为大写 ('b' & '_') = 'B' ('B' & '_') = 'B' 利用异或操作 ^ 和空格进行英文字符大小写互换 ('d' ^ ' ') = 'D' ('D' ^ ' ') = 'd' 判断两个数是否异号 int x = -1, y = 2; bool f = ((x ^ y)原创 2020-10-12 20:06:44 · 75 阅读 · 0 评论 -
学习算法--回溯算法
回溯 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。 便于解决树形问题的情况,比如选择子序列的问题,寻找路径等 当出现重复情况或不满足条件的时候退出 模板 public void backTrace(int start, int[] nums, List<Integer> temp){ base case 条件处理 /原创 2020-09-05 16:39:42 · 193 阅读 · 0 评论 -
1306. 跳跃游戏 III 使用搜索进行
1306. 跳跃游戏 III 这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。 请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。 注意,不管是什么情况下,你都无法跳到数组之外。 这一题是跟着数组下标跳跃进行目标点,最终到达0点,根据规则 在每个点上 可以跳到 i + arr[i] 或者 i - arr[i]。 使用广搜进行判断,进入第一个节点,然后根据规则 i + arr[i] 或原创 2020-09-03 22:46:02 · 160 阅读 · 0 评论 -
广度优先搜索题记
101 对称二叉树 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 解题:本题在于判断左右节点的是否相等,判断子树是否相当.使用队列实现,每次出队或入队左右两个,进行两两比较. 第一层时,节点的左节点和右节点比较 第二原创 2020-09-03 11:35:13 · 80 阅读 · 0 评论 -
广度优先搜索
基本步骤: 1.从图中某个顶点v0出发,首先访问v0; 2.依次访问v0的各个未被访问的邻接点; 3.依次从上述邻接点出发,访问它们的各个未被访问的邻接点。 4.若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点。重复广度优先搜索过程,直到图中的所有节点均被访问过。 基本代码结构 通常用队列(先进先出,FIFO)实现 初始化队列Q. Q={起点s}; 标记s为己访问; while (Q非空) { 取Q队首元素u; u出队; if (u == 目标状态)原创 2020-09-01 15:24:40 · 199 阅读 · 0 评论 -
2019省赛真题详解
组队 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。 每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少? 这题手算即可,但是还是给出代码运算也行 两种解决方法 1.暴力破解法,直接嵌套5层for循环 2.贪心算法,每次选择当前位最高的人,保存总和,三次for循环,以不同位置起手结果不同,所以首层遍历5次位置,二层选出其他号位号位的最高成绩,3层选出本号位最高的选手. 不同的子串 一个字符串的原创 2020-08-29 17:26:15 · 772 阅读 · 0 评论 -
比较大小406. 根据身高重建队列
406. 根据身高重建队列 假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。 注意: 总人数少于1100人。 输入: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 输出: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] 先比较总的身高大小,按照身高从大到小进行排序,因为k的值是按照前面是否有k个人高于或等于原创 2020-08-27 19:51:24 · 211 阅读 · 0 评论 -
贪心-881. 救生艇
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回载到每一个人所需的最小船数。(保证每个人都能被船载)。 输入:people = [1,2], limit = 3 输出:1 解释:1 艘船载 (1, 2) 输入:people = [3,2,2,1], limit = 3 输出:3 解释:3 艘船分别载 (1, 2), (2) 和 (3) 输入:people = [3,2,2,1], limit =原创 2020-08-26 23:40:38 · 173 阅读 · 0 评论 -
1403. 非递增顺序的最小子序列-贪心算法
内容 给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。 如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。 与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。 注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。 此题目是从子序列中抽取最大的数字,而不是从给原创 2020-08-25 19:16:40 · 232 阅读 · 0 评论 -
1217. 玩筹码
数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。 你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以): 将第 i 个筹码向左或者右移动 2 个单位,代价为 0。 将第 i 个筹码向左或者右移动 1 个单位,代价为 1。 最开始的时候,同一位置上也可能放着两个或者更多的筹码。 返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。 输入:chips = [2,2,2,3,3] 输出:2 解释:第四和第五个筹码移动到位置二的代价都是 1, 所以最小总代价为 2。 输原创 2020-08-25 18:20:01 · 135 阅读 · 0 评论 -
1046. 最后一块石头的重量
1046. 最后一块石头的重量 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下: 如果 x == y,那么两块石头都会被完全粉碎; 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。 最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。 我的解决方案:暴力破解 遍历排序,每次大小排序后,将倒数的两个数子相减,末原创 2020-08-25 16:17:08 · 78 阅读 · 0 评论 -
从零开始---贪心算法
学习目标:贪心算法 来自知乎的视学算法 链接: 知乎-贪心算法. 掌握贪心算法, 学习内容: 提示:以后要学的内容 例如: 1、 贪心算法 2、 分而治之算法(递归) 3、 动态规划 4、 暴力解法 内容: 假设一个问题比较复杂,暂时找不到全局最优解,那么我们可以考虑把原问题拆分成几个小问题,分别求每个小问题的最优解,再叠加这些"全局最优解",就"当作"整个问题的最优解了 贪心算法3步走 第一步 明确到底什么是最优解,明确后记录下来 第二步 明确什么是子问题的最优解?再记录再本子上 第三步 分别求转载 2020-08-23 18:47:09 · 7653 阅读 · 0 评论