算法题
深入了解算法,只要掌握算法,无论什么语言都不怕
Frank.Ren
这个作者很懒,什么都没留下…
展开
-
java leetcode dailywork 数组中重复的数据
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。 你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。 class Solution { public List<Integer> findDuplicates(int[] nums) { List<Integer> list = new A原创 2022-05-08 17:33:17 · 145 阅读 · 1 评论 -
java 单链表实现 (更新)
public class MySingleList { static class ListNode { private int value; private ListNode next; public ListNode() { } public ListNode(int value) { this.value = value; } public int g.原创 2022-05-08 14:48:29 · 73 阅读 · 1 评论 -
杨辉三角 leetcoed java arraylist
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> arr = new ArrayList<>(); List<Integer>原创 2022-04-27 12:31:21 · 485 阅读 · 1 评论 -
leetcode java篇 dailywork 随机数索引
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。 注意: 数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。 import java.util.Random; class Solution { Random random = new Random(); int[] nums; public Solution(int[] _nums) { nums = _nums; } .原创 2022-04-25 14:31:11 · 343 阅读 · 1 评论 -
leetcode 加一 java
加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 class Solution { public int[] plusOne(int[] digits) { int len = digits.length; for (int i = len - 1; i >= 0; i--) {原创 2022-04-22 09:06:12 · 873 阅读 · 1 评论 -
leetcode daily work 最富有客户的资产总量
给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。 客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。 class Solution { public int maximumWealth(int[][] accounts) { int m = accounts.length; int原创 2022-04-14 13:02:14 · 205 阅读 · 1 评论 -
leetcode 每日一题 java篇
写字符串需要的行数 我们要把给定的字符串 S 从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行。我们给定了一个数组 widths ,这个数组 widths[0] 代表 'a' 需要的单位, widths[1] 代表 'b' 需要的单位,..., widths[25] 代表 'z' 需要的单位。 现在回答两个问题:至少多少行能放下S,以及最后一行使用的宽度是多少个单位?将你的答案作为长度为2的整数列表返回。原创 2022-04-12 10:29:05 · 525 阅读 · 1 评论 -
leetcode 每日一题 Java篇
纯数学题 统计各位数字都不同的数字个数 给你一个整数n,统计并返回各位数字都不同的数字x的个数,其中0 <= x < 10n。 class Solution { public int countNumbersWithUniqueDigits(int n) { if(n==0){ return 1; } if(n==1){ return 10; ...原创 2022-04-11 12:45:43 · 801 阅读 · 1 评论 -
唯一摩尔斯密码词 leetcode Java篇
国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串,比如: 'a' 对应 ".-" , 'b' 对应 "-..." , 'c' 对应 "-.-." ,以此类推。 为了方便,所有 26 个英文字母的摩尔斯密码表如下: [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-...原创 2022-04-10 10:45:53 · 100 阅读 · 1 评论 -
买卖股票的最佳时机 leetcode java篇
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 两种方法,动态规划+暴力解法 class Solution { public int maxProfit(int[] prices){ int len = pri.原创 2022-03-30 17:20:20 · 824 阅读 · 1 评论 -
动态规划系列(1) leetcode java
斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是: 核心思想: F(n)=F(n−1)+F(n−2) class Solution { public int fib(int n) { int f0 = 0; int f1 = 1; int tmp; if(n<=1){ return n; ...原创 2022-03-29 14:22:18 · 96 阅读 · 1 评论 -
考试的最大困扰度 leetcode java篇
一位老师正在出一场由 n道判断题构成的考试,每道题的答案为 true (用 'T' 表示)或者 false (用 'F'表示)。老师想增加学生对自己做出答案的不确定性,方法是最大化有 连续相同结果的题数。(也就是连续出现 true 或者连续出现 false)。 给你一个字符串answerKey,其中answerKey[i]是第 i个问题的正确结果。除此以外,还给你一个整数 k,表示你能进行以下操作的最多次数: 每次操作中,将问题的正确答案改为'T' 或者'F'(也就是将 an...原创 2022-03-29 13:51:28 · 719 阅读 · 1 评论 -
最大子数组和 leetcode java篇
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 class Solution { public int maxSubArray(int[] ns) { int max = ns[0]; int pre = 0; for(int x:ns){ pre +=x; pre = Math.max(pr..原创 2022-03-29 12:45:54 · 68 阅读 · 1 评论 -
搜索插入位置 leetcode java篇
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 p.s. 用移位操作符时一定要打括号,不然优先级太后面了,会导致死循环; intmid=l+((r-l)>>1); 刚开始我一直没想通,把我害惨了; 还出现: Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported fo...原创 2022-03-29 11:47:43 · 534 阅读 · 1 评论 -
移除元素 leetcode java篇
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 class Solution { public int removeElement(int[] nums, int val) { int j = nums.length - 1; for..原创 2022-03-28 20:59:47 · 423 阅读 · 1 评论 -
删除有序数组中的重复项 leetcode java篇
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 ..原创 2022-03-28 19:55:53 · 47 阅读 · 1 评论 -
在排序数组中查找元素的第一个和最后一个位置 java篇 leetcode
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回[-1, -1]。 进阶: 你可以设计并实现时间复杂度为O(log n)的算法解决此问题吗? class Solution { public int binarySearch(int[] nl, int target, boolean flag) { int l = 0; int...原创 2022-03-27 12:51:39 · 878 阅读 · 1 评论 -
有效的括号 leetcode java篇
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 class Solution { public boolean isValid(String s) { char[] arr = s.toCharArray(); int len = arr.length; int[] stacks = new int[l原创 2022-03-26 17:49:13 · 428 阅读 · 1 评论 -
整数反转 leetcode java篇
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围[−231,231− 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 class Solution { public int reverse(int x) { int ret = 0; while(x!=0){ if (ret < Integer.MIN_VALUE /...原创 2022-03-25 11:06:09 · 843 阅读 · 1 评论 -
无重复字符的最长子串 leetcode java篇
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度 class Solution { public int lengthOfLongestSubstring(String s) { int[] map = new int[127]; // map = {0}; char[] arr = s.toCharArray(); int len = arr.length; int l ...原创 2022-03-24 16:19:54 · 1153 阅读 · 1 评论 -
leetcode 刷题篇 java 二进制位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的示例 3中,输入表示有符号整数 -3。 public cl...原创 2022-03-24 14:20:14 · 63 阅读 · 1 评论 -
只出现一次的数字 leetcode 刷题篇
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? int singleNumber(int* nums, int numsSize){ int n = 0; while(numsSize--){ n^=nums[numsSize]; } return n; } ...原创 2022-03-20 14:48:22 · 222 阅读 · 1 评论 -
验证回文串 双指针 leetcode 刷题篇
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 整体思路还是清晰的,就是两头指针不断比较,并跳过无效的字符; 就是跳过时的判断需要思考下,漏写了可不好; bool isPalindrome(char* s) { if(s==NULL){ return true; } int r = strlen(s) - 1; int l = 0; whil...原创 2022-03-18 15:05:56 · 912 阅读 · 1 评论 -
二叉树 路径总和 树状链表 leetcode 刷题篇
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没有子节点的节点。 bool hasPathSum(struct TreeNode* root, int targetSum){ if(root==NULL){ return false; } if(r.原创 2022-03-18 13:34:04 · 366 阅读 · 1 评论 -
删除排序链表中的重复元素 leetcode 刷题篇
给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* deleteDuplicates(struct ListNode* head){ if(head==N...原创 2022-03-18 13:10:11 · 202 阅读 · 1 评论 -
合并两个有序数组 leetcode 刷题篇
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。 int compare (cons.原创 2022-03-18 12:55:56 · 198 阅读 · 1 评论 -
爬楼梯 leetcode 刷题篇 递归or动态规划
假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢? 用递归时间复杂度太高了,还是动态规划方便 其实动态规划就是指下一次结果用之前的结果得出,这样就可以大大减少复杂度; 而递归则是将每一种可能都运算到底,这样会重复计算好多次相同的数据,运算时间自然就长了; // int fib(int n){ // if(n<2){ // return 1; // } // return fi...原创 2022-03-18 11:07:51 · 331 阅读 · 1 评论 -
x 的平方根 leetcode 刷题篇
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 暴力算法大家都会, 这题中一个地方是要避免数据溢出,可以做大小判断, 也可以像我一样,直接除掉,更加方便一点. int mySqrt(int x) { int left = 1, right = x / 2 + 1; while (left &l.原创 2022-03-18 10:45:57 · 197 阅读 · 1 评论 -
二进制求和 leetcode 刷题篇
二进制求和 leetcode 刷题篇原创 2022-03-18 10:29:07 · 187 阅读 · 1 评论 -
leetcode dailyWork 最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 int lengthOfLastWord(char * s){ int i = strlen(s)-1; while(s[i]==' '){ i--; } int start = i; while(i>=0&&s[i]!=' '){ i原创 2022-03-17 11:26:21 · 59 阅读 · 1 评论 -
leetcode dailyWork - 数组串联
给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,对于所有 0 <= i < n 的 i ,满足下述所有要求: ans[i] == nums[i] ans[i + n] == nums[i] 具体而言,ans 由两个 nums 数组 串联 形成。 返回数组 ans 。 int* getConcatenation(int* nums, int numsSize, int* returnSize){ ...原创 2022-03-17 11:14:10 · 101 阅读 · 1 评论 -
leetcode 刷题篇 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 简单粗暴..... 效率也不错. int comp(const void * a, const void * b){ return *(int*)a - *(int*)b; } int majorityElement(int* nums, int numsSize){ qsort(nums,numsSiz原创 2022-03-15 13:26:39 · 456 阅读 · 1 评论 -
最大子数组和 leetcode 刷题篇 动态规划
给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 int maxi(int a, int b){ return a>b?a:b; } int maxSubArray(int* nums, int numsSize){ int max = nums[0]; int pre = 0; for(int i=0;i<numsSize;i++){ p...原创 2022-03-15 12:04:37 · 1463 阅读 · 1 评论 -
四数之和 leetcode 刷题篇 动态规划题(进阶版)
给你一个由 n 个整数组成的数组nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组[nums[a], nums[b], nums[c], nums[d]](若两个四元组元素一一对应,则认为两个四元组重复): 0 <= a, b, c, d< n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target 你可以按 任意顺序 返回答案 。 部分代码如下: int ...原创 2022-03-10 11:44:25 · 85 阅读 · 1 评论 -
最长回文子串 leetcode 刷题篇
给你一个字符串s,找到s中最长的回文子串。 完整代码已上传至github,放在dailyWork_2022_2_9文件夹中: GitHub - frankRenlf/c_dailyWorkhttps://github.com/frankRenlf/c_dailyWork.git部分代码如下: int decided(char* s, int l, int r) { while (l >= 0 && r < strlen(s) && s[...原创 2022-03-07 18:06:15 · 341 阅读 · 1 评论