数据结构和算法
学习数据结构和算法
dugeyang0520
这个作者很懒,什么都没留下…
展开
-
Java快排
100 12 14 17 64 53 1335 277 27 2727 | | 有两个指针,指向数组的最左和最右,拿出一个变量叫做 key记录最左侧的元素大小现在开始遍历,右边指针向左移动,找到小于key的地方停下来,左边指针向右移动,找到大于key的元素停下来,然后左右交换元素,继续前进,直到两个指针重合,然后重合处和key交换。这就完成了一趟排序,k...原创 2021-09-07 10:11:34 · 200 阅读 · 0 评论 -
Leetcode 55.跳跃游戏
题目描述:给定一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。解题思路:遍历数组,有一个初始能量,然后每一次前进一次,判断当前能量与前进的这个地方能量谁大,(每次前进时当前能量眼减一,就相当于跳了一下),如果某时当前能量为0,那就说明跳不动了。Java代码实现:class Solution { public boolean canJump(int[] nums)...原创 2021-08-17 09:32:13 · 133 阅读 · 0 评论 -
Leetcode 213.打家劫舍Ⅱ
题目描述:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。解题思路:这个题和198题不一样的地方在于,所有住户连城了一个环,所以第一家和最后一家不能同时偷,那么我们就把环拆成两个链,一.原创 2021-08-16 14:24:06 · 145 阅读 · 0 评论 -
Leetcode 198.打家劫舍
题目描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。解题思路:每一步都要考虑偷还是不偷,(限制条件:上一个偷了,这一个就不能偷),所以在更新当前偷不偷的状态时,要考虑到前一家偷了没,如果当前这家没偷,那么这家的金额就等于之前的最大金..原创 2021-08-16 11:46:48 · 87 阅读 · 0 评论 -
Leetcode 62.不同路径
题目描述:一个机器人位于一个 m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?解题思路:这是一个经典的动态规划题,从开始位置到第一行或者第一列,永远只有一种走法,然后到其余的地方,可以从上往下,也可以从左往右,所以到该位置的走法就有【上走法】+【下走法】,依次类推。java代码实现:class Solution {..原创 2021-08-14 11:28:06 · 223 阅读 · 0 评论 -
Leetcode 53.最大子序和
题目描述:给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。思路分析:这是一道动态规划的简单题,动态规划就是每一步,都需要有可以直接返回的结果,然后下一步还要借用这次的结果,最后找出符合返回条件的那一个。java代码实现:class Solution { public int maxSubArray(int[] nums) { if(nums.length == 1){ ...原创 2021-08-13 14:54:50 · 64 阅读 · 0 评论 -
leetcode 495.提莫攻击
题目描述:在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒状态总时长。你可以认为提莫在给定的时间点进行攻击,并立即使艾希处于中毒状态。思路分析:可以一步一步计算他的中毒时间,这是简单的解法还可以计算他中毒了多少次,然后减去被覆盖的时间(比如第一秒中毒,持续五秒,但是第二秒又中毒了,那么就相当于第二次被覆盖了四秒)java代码实现:原创 2021-04-28 22:26:55 · 124 阅读 · 0 评论 -
leetcode 86.分隔链表
题目描述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。思路:首先要保证原链表的顺序小的放在前边,大于等于的放在后面java代码实现:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNod原创 2021-04-28 15:46:48 · 103 阅读 · 0 评论 -
leetcode 1572.矩阵对角线元素的和
题目描述:给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。题目不难,可以使用暴力法,二维数组需要使用两层循环, 我的方法使用单层循环来实现java代码实现:class Solution { public int diagonalSum(int[][] mat) { int sum = 0; for(int i = 0;i < mat.length/2;i原创 2021-04-20 16:53:18 · 264 阅读 · 0 评论 -
leetcode 45.跳跃游戏Ⅱ
题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。本题首先需要一个思路,就是当前位置的元素保存的为可跳步长,如果能到尾巴,则直接结束,如果不能直接到则需要寻找当前步长内可到达的最有利位置 什么是最有利位置呢 就是从当前位置到那个位置需要跳的长度 加上 那个位置的可跳步长(也就是那个位置的元素大小)java代码实现:class Solution { ..原创 2021-04-18 21:34:27 · 243 阅读 · 0 评论 -
leetcode 2.两数相加
题目描述:给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。仔细看题,原链表中的数字是倒着排的,结果链表中的数字也需要倒着排,所以在构建结果链表时 使用尾插法java代码实现:/** * Definition for singly-linked list. * public class ...原创 2021-04-18 20:22:45 · 244 阅读 · 0 评论 -
leetcode 1800.最大升序子数组和
题目描述:给你一个正整数组成的数组 nums ,返回 nums 中一个 升序 子数组的最大可能元素和。子数组是数组中的一个连续数字序列。已知子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,若对所有 i(l <= i < r),numsi < numsi+1 都成立,则称这一子数组为 升序 子数组。注意,大小为 1 的子数组也视作 升序 子数组。本题可以采用单层循环,一边遍历一边计算java代码实现class Solut原创 2021-04-16 19:23:11 · 221 阅读 · 0 评论 -
leetcode 1748.唯一元素的和
题目描述:给你一个整数数组nums。数组中唯一元素是那些只出现恰好一次的元素。请你返回 nums中唯一元素的 和。这道题比较简单,可以使用双重循环判断,也可以使用额外空间来标记java代码实现:class Solution { public int sumOfUnique(int[] nums) { int sum = 0; int[] a = new int[100]; for(int i = 0;i <...原创 2021-04-16 19:10:36 · 381 阅读 · 0 评论 -
leetcode 1629.按键持续时间最长的键
题目描述:LeetCode 设计了一款新式键盘,正在测试其可用性。测试人员将会点击一系列键(总计 n 个),每次一个。给你一个长度为 n 的字符串 keysPressed ,其中 keysPressed[i] 表示测试序列中第 i 个被按下的键。releaseTimes 是一个升序排列的列表,其中 releaseTimes[i] 表示松开第 i 个键的时间。字符串和数组的 下标都从 0 开始 。第 0 个键在时间为 0 时被按下,接下来每个键都 恰好 在前一个键松开时被按下。测试人员想要找出按原创 2021-04-16 13:24:12 · 158 阅读 · 0 评论 -
牛客网 NC53 删除链表的倒数第n个节点
题目描述:给定一个链表,删除链表的倒数第 nnn 个节点并返回链表的头指针例如,给出的链表为: 1→2→3→4→51\to 2\to 3\to 4\to 51→2→3→4→5, n=2n= 2n=2.删除了链表的倒数第 nnn 个节点之后,链表变为1→2→3→51\to 2\to 3\to 51→2→3→5.题目保证 nnn 一定是有效的请给出请给出时间复杂度为O(n) 的算法题目分析:时间复杂度为O(n),所以循环只能单层先计算链表长度,然后计算需要删除的节点,进行.原创 2021-04-12 21:54:44 · 106 阅读 · 0 评论 -
牛客网 剑指Offer JZ42 和为S的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。分析题目:数组是有序的结果如果有多组,返回乘积最小的一组java代码实现:import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {原创 2021-04-12 19:39:42 · 71 阅读 · 0 评论 -
leetcode 961.重复N次的元素
题目描述:在大小为 2N的数组 A中有 N+1 个不同的元素,其中有一个元素重复了 N 次。返回重复了 N次的那个元素。使用java实现class Solution { public int repeatedNTimes(int[] A) { Arrays.sort(A); for(int i = 0;i <= A.length/2;i++){ if(A[i] == A[i+A.length/2-1]){...原创 2021-04-06 18:33:14 · 145 阅读 · 0 评论 -
leetcode 1189.“气球“的最大数量
题目描述:给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。解题思路:当然可以直接暴力的一次次对比,可以出来结果我的思路是,直接计数“气球”中各个字母的数量,两个字母的 l 和 o 除以2,最小的计数器决定有几个“气球”...原创 2021-03-27 22:22:22 · 173 阅读 · 0 评论 -
leetcode 283.移动零
题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。使用java来实现class Solution { public void moveZeroes(int[] nums) { int count = 0; for(int i = 0;i < nums.length;i++){ if(nums[i] != 0){ int ss = n原创 2021-03-27 21:33:41 · 70 阅读 · 0 评论 -
leetcode 268.丢失的数字
题目描述:给定一个包含 [0, n]中n个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。使用JAVA来实现class Solution { public int missingNumber(int[] nums) { int sum = 0; if(nums.length % 2 == 0){ sum = (1 + nums.length) * nums.length/2; ...原创 2021-03-27 20:38:12 · 111 阅读 · 0 评论 -
leetcode 1.两数之和
开始写leetcode的算法题,有空了就去研究研究,先从第一题开始题目描述:给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 的那两个整数,并返回它们的数组下标。我使用 JAVA 来写class Solution { public int[] twoSum(int[] nums, int target) { int[] a = new int[2]; for(int i = 0;i < nu...原创 2021-03-22 22:30:02 · 61 阅读 · 0 评论 -
使用数组实现队列
队列的特点是先进先出,我们使用数组来实现以下队列import java.util.Scanner;//使用数组模拟队列public class quenedemo01 { public static void main(String[] args) { ArrayQuene quene = new ArrayQuene(3); Scanner scanner = new Scanner(System.in); System.out.prin原创 2021-03-20 20:52:15 · 113 阅读 · 2 评论 -
JAVA 稀疏数组(五子棋例子)
讲到稀疏数组,那常见的例子就是五子棋,稀疏数组就是为了减少空间资源浪费,来看一下将二维数组五子棋改写为稀疏数组//稀疏数组 五子棋public class SparseArray { public static void main(String[] args) { //创建一个二维数组表示原始数据 //0表示没有棋子 //1表示黑子 2表示白子 int chessArr[][] = new int[11][11];原创 2021-03-20 19:55:44 · 172 阅读 · 2 评论