算法
小高求学之路
22届毕业生,2021年荣获第十二届蓝桥杯陕西赛区二等奖
展开
-
通过某个公共属性 合并2个list
【代码】通过某个公共属性 合并2个list。原创 2024-03-13 09:22:25 · 107 阅读 · 0 评论 -
时间复杂度和运算
在算法和数据结构中,有许多时间复杂度比 O(1) 更差的情况。常数时间复杂度,操作的运行时间与输入规模无关,是最理想的情况。对数时间复杂度,常见于分治算法和二分搜索等。线性时间复杂度,操作的运行时间与输入规模成正比。线性对数时间复杂度,常见于一些高效的排序算法,如快速排序和归并排序。平方时间复杂度,常见于一些简单的嵌套循环算法-选择,冒泡,插入多项式时间复杂度,其中 k 是常数,通常表示更高次幂的多项式时间复杂度。指数时间复杂度,常见于一些指数级增长的问题,如穷举搜索。原创 2023-11-21 23:26:41 · 341 阅读 · 0 评论 -
验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: “A man, a plan, a canal: Panama”输出: true解释:“amanaplanacanalpanama” 是回文串示例 2:输入: “race a car”输出: false解释:“raceacar” 不是回文串思路如下:代码如下: public boolean isPalindrome(String s原创 2021-11-17 08:26:33 · 65 阅读 · 2 评论 -
合并两个有序数组
官方API 做法:class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { System.arraycopy(nums2,0,nums1,m,n); Arrays.sort(nums1); }}双指针做法class Solution { public void merge(int[] nums1, int m, int[] nu.原创 2021-09-23 10:13:21 · 54 阅读 · 1 评论 -
搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列**第一种:暴力递归,但是这样时间就会消耗很多 不推荐**第二种:从矩阵的右上角开始找如果找的值比target大,这个时候列就向左移动如果找的值比target小,这个时候行就向下移动class Solution { public boolean searchMatrix(int[][] matrix, int ta原创 2021-09-23 09:35:20 · 47 阅读 · 1 评论 -
冒泡排序,并输出每一趟的排序结果
public static void main(String[] args) { int[] arr = {6, 3, 8, 2, 9, 1}; for (int i = 1; i < arr.length; ++i) { for (int j = 1; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { i原创 2021-09-18 11:41:58 · 9889 阅读 · 7 评论 -
多数元素 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法一: 因为要求的输出数组中长度大于一半的数,那么证明 如果先将数组进行排序完后,中间的数一定是出现最多的,所以直接返回中间的数就行。class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; }}...原创 2021-09-14 10:14:50 · 1858 阅读 · 1 评论 -
给出一个数组,里面的元素至少有1个,请找出只出现一次的数,并用数组返回
import java.util.*;public class Main { public static void main(String[] args) { int nums[] = {3, 1, 2, 2, 5, 5, 6, 6}; int[] ints = singleNumber(nums); for (int i = 0; i < ints.length; i++) { System.out.print..原创 2021-09-12 16:49:24 · 221 阅读 · 1 评论 -
53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
class Solution { public int maxSubArray(int[] nums) { if(nums.length==1){ return nums[0]; } int ans=nums[0]; int sum=0; for(int num:nums){ if(sum>0){ sum+=num; .原创 2021-09-11 09:34:32 · 328 阅读 · 1 评论 -
217. 存在重复元素 给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
class Solution { public boolean containsDuplicate(int[] nums) { Set<Integer> set = new HashSet<Integer>(); for (int x : nums) { if (!set.add(x)) { return true; } } ret.原创 2021-09-11 09:32:13 · 860 阅读 · 1 评论 -
167. 两数之和 II - 输入有序数组
class Solution { public int[] twoSum(int[] numbers, int target) { int arr[] =new int [2]; int left=0,right=numbers.length-1; while(left<right){ int sum =numbers[left]+numbers[right]; if(sum==target){.原创 2021-09-11 09:21:33 · 55 阅读 · 1 评论 -
283. 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
class Solution { public void moveZeroes(int[] nums) { int j = 0; for(int i = 0; i<nums.length;i++){ if(nums[i]!=0){ int temp=nums[i]; nums[i]=nums[j]; nums[j++]=temp; .原创 2021-09-11 09:03:56 · 525 阅读 · 3 评论 -
力扣152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。class Solution { public int maxProduct(int[] nums) { int maxF=nums[0],minF=nums[0],ans=nums[0]; for(int i = 1; i<nums.length;i++){ int mx= maxF,mn=minF;原创 2021-09-10 16:33:51 · 66 阅读 · 1 评论 -
918. 环形子数组的最大和
给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和。在此处,环形数组意味着数组的末端将会与开头相连呈环状。(形式上,当0 <= i < A.length 时 C[i] = A[i],且当 i >= 0 时 C[i+A.length] = C[i])此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次。(形式上,对于子数组 C[i], C[i+1], …, C[j],不存在 i <= k1, k2 <= j 其中 k1 % A.length =原创 2021-09-10 16:05:47 · 118 阅读 · 1 评论 -
力扣53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
class Solution { public int maxSubArray(int[] nums) { if(nums.length==1){ return nums[0]; } int ans=nums[0]; int sum=0; for(int num:nums){ if(sum>0){ sum+=num; .原创 2021-09-10 10:19:00 · 324 阅读 · 1 评论 -
力扣189. 旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
class Solution { public void rotate(int[] nums, int k) { k%=nums.length; resever(nums,0,nums.length-1); resever(nums,0,k-1); resever(nums,k,nums.length-1); } public void resever(int [] nums,int start,int end.原创 2021-09-10 09:54:02 · 311 阅读 · 1 评论 -
力扣977. 有序数组的平方(双指针)
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。class Solution { public int[] sortedSquares(int[] nums) { int n = nums.length; int[] ans = new int[n]; for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {原创 2021-09-10 09:29:43 · 104 阅读 · 1 评论 -
跳跃游戏 II
class Solution { public int jump(int[] nums) { int length = nums.length; int end = 0; int maxPosition = 0; int steps = 0; for (int i = 0; i < length - 1; i++) { maxPosition = Math.max(maxPosition.原创 2021-09-09 18:45:48 · 82 阅读 · 0 评论 -
跳跃游戏(贪心)
public class Solution { public boolean canJump(int[] nums) { int n = nums.length; int max = 0; for (int i = 0; i < n; ++i) { if (i <= max) { max = Math.max(max, i + nums[i]); if.原创 2021-09-09 16:37:08 · 81 阅读 · 1 评论 -
删除并获得点数
class Solution { public int deleteAndEarn(int[] nums) { int maxVal = 0; for (int val : nums) { maxVal = Math.max(maxVal, val); } int[] sum = new int[maxVal + 1]; for (int val : nums) { su.原创 2021-09-09 15:06:30 · 84 阅读 · 1 评论 -
使用最小花费爬楼梯(动态数组)
class Solution { public int minCostClimbingStairs(int[] cost) { int n = cost.length,curr=0,prev=0; for(int i = 2; i<=n;i++){ int next = Math.min(curr + cost[i - 1], prev + cost[i - 2]); prev=curr; .原创 2021-09-09 10:43:04 · 67 阅读 · 1 评论 -
爬楼梯(动态) 算法
class Solution { public int climbStairs(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for(int i = 2; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; }}原创 2021-09-09 10:10:31 · 88 阅读 · 1 评论 -
第 N 个泰波那契数
class Solution { public int tribonacci(int n) { if(n==0){ return 0; } if(n==1){ return 1; } int left =0,right = 1, sum=0; int []nums = new int [n+1]; nums[0]=0; nu.原创 2021-09-09 10:00:08 · 53 阅读 · 1 评论 -
切割字符串
import java.util.HashMap;// 来自京东// 把一个01字符串切成多个部分,要求每一部分的0和1比例一样,同时要求尽可能多的划分// 比如 : 01010101// 01 01 01 01 这是一种切法,0和1比例为 1 : 1// 0101 0101 也是一种切法,0和1比例为 1 : 1// 两种切法都符合要求,但是那么尽可能多的划分为第一种切法,部分数为4// 比如 : 00001111// 只有一种切法就是00001111整体作为一块,那么尽可能多的划分..原创 2021-09-06 10:16:35 · 113 阅读 · 1 评论 -
找到数组中和为k有几种
import java.util.HashMap;public class 前缀和 { public static int subarraySum(int[] nums, int k) { if (nums == null || nums.length == 0) { return 0; } HashMap<Integer, Integer> preSumTimesMap = new HashMap<&..原创 2021-09-06 09:38:50 · 248 阅读 · 1 评论 -
小朋友分糖果
/**// 来自网易// 给定一个正数数组arr,表示每个小朋友的得分// 任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果// 假设所有的小朋友坐成一个环形,返回在不破坏上一条规则的情况下,需要的最少糖果数*/public class 小朋友分糖果 { public static int minCandy(int[] arr) { if (arr == null || arr.length == 0) {原创 2021-09-06 09:28:33 · 126 阅读 · 1 评论 -
魔力石头(大厂笔试)
/** * // 来自小红书 * // [0,4,7] : 0表示这里石头没有颜色,如果变红代价是4,如果变蓝代价是7 * // [1,X,X] : 1表示这里石头已经是红,而且不能改颜色,所以后两个数X无意义 * // [2,X,X] : 2表示这里石头已经是蓝,而且不能改颜色,所以后两个数X无意义 * // 颜色只可能是0、1、2,代价一定>=0 * // 给你一批这样的小数组,要求最后必须所有石头都有颜色,且红色和蓝色一样多,返回最小代价 * // 如果怎么都无法做到所有石头都有.原创 2021-09-06 08:45:04 · 131 阅读 · 1 评论 -
给一个数组array,一个目标值target,找到数组中两个数相加,离目标值最近的值(小于等于target)并输出,没有则输出-1
import java.util.Arrays;public class Main { public static void main(String[] args) { int[] array = {-1,-3,-5,-9,-7}; System.out.println(closestValue(array, 6)); } public static int closestValue(int[] array, int target)...原创 2021-09-01 18:51:18 · 640 阅读 · 1 评论 -
java实现获取两个list交集,并集,差集
import java.util.ArrayList;import java.util.List;import static java.util.stream.Collectors.toList;public class Main { public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); l..原创 2021-08-26 09:05:40 · 3766 阅读 · 1 评论 -
打家劫舍(递归+动态规划)+题目升级
代码如下:/** * @author 32114 * @date 2021/8/21 13:59 */public class 打家劫舍 { public static void main(String[] args) { int [] nums={1,2,3}; System.out.println(maxMoney(nums, nums.length - 1)); System.out.println(maxMoneyDP(..原创 2021-08-21 14:26:12 · 151 阅读 · 1 评论 -
省份数量(深度)
深度遍历public class 省份数量 { public static void main(String[] args) { System.out.println(getProvince(new int[][]{{1, 1, 0}, {1, 1, 0}, {0, 0, 1}}));//2 System.out.println(getProvince(new int[][]{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}));//...原创 2021-08-16 15:04:06 · 85 阅读 · 1 评论 -
三角形最大周长(贪心算法)
import java.util.Arrays;public class Main{ public static void main(String[] args) { System.out.println(largest(new int[]{3, 6, 2, 3})); } private static int largest(int []a) { Arrays.sort(a); for (int i = a.length -..原创 2021-08-08 16:00:42 · 223 阅读 · 1 评论 -
柠檬水找零(贪心算法)
public class Main{ public static void main(String[] args) { System.out.println(change(new int[]{5, 5,10,20})); } private static boolean change(int[] bills) { int five = 0, ten = 0; for (int bill : bills) { ..原创 2021-08-08 09:44:10 · 138 阅读 · 1 评论 -
最长连续递增序列(贪心算法)
public class Main { public static void main(String[] args) { System.out.println(findLength(new int[]{1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 7})); } private static int findLength(int[] nums) { int start=0; int max=0; fo..原创 2021-08-08 09:16:21 · 110 阅读 · 1 评论 -
二叉树广度遍历找最小深度
package demo;import java.util.LinkedList;import java.util.Queue;public class Main { public static void main(String[] args) { TreeNode node7 = new TreeNode(7, null, null); TreeNode node6 = new TreeNode(6, node7, null); Tree.原创 2021-08-08 09:15:23 · 68 阅读 · 1 评论 -
二叉树深度遍历找最小深度
public class Main { public static void main(String[] args) { TreeNode node7 = new TreeNode(7, null, null); TreeNode node6 = new TreeNode(6, node7, null); TreeNode node5 = new TreeNode(5, null, null); TreeNode node4 = ...原创 2021-08-07 22:59:50 · 86 阅读 · 1 评论 -
子数组最大平均数
package demo;public class 子数组最大平均数 { public static void main(String[] args) { System.out.println(findMaxAverage(new int[]{1, 12, -5, -6, 50, 3}, 4)); } public static double findMaxAverage(int [] nums,int k){ int sum=0; .原创 2021-08-07 22:31:31 · 58 阅读 · 1 评论 -
排序硬币算法
package demo;public class 排序硬币 { public static void main(String[] args) { System.out.println(sortCoins1(10)); System.out.println(sortCoins2(10)); System.out.println(sortCoins3(10)); } /** * 暴力算法 迭代 * *.原创 2021-08-07 17:51:00 · 131 阅读 · 1 评论 -
斐波那契数列
package demo;public class 斐波那契数列 { public static void main(String[] args) { System.out.println(fib(10)); System.out.println(fib2(10)); System.out.println(fib3(10)); } private static int fib(int num) { if (num=.原创 2021-08-07 17:33:13 · 52 阅读 · 1 评论 -
寻找数组的中心下标
package demo;import java.util.Arrays;/** * 中心下标的左边和右边的值是相等的 * 利用双指针来实现 */public class 寻找数组的中心下标 { public static void main(String[] args) { System.out.println(privotIndex(new int[]{1, 7, 3, 6, 5, 6})); } private static int pri.原创 2021-08-07 17:32:35 · 73 阅读 · 1 评论