diff --git a/算法/learn/.gitignore b/算法/learn/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/算法/learn/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/算法/learn/.mvn/wrapper/maven-wrapper.jar b/算法/learn/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..c1dd12f Binary files /dev/null and b/算法/learn/.mvn/wrapper/maven-wrapper.jar differ diff --git a/算法/learn/.mvn/wrapper/maven-wrapper.properties b/算法/learn/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..b7cb93e --- /dev/null +++ b/算法/learn/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/算法/learn/mvnw b/算法/learn/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/算法/learn/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/算法/learn/mvnw.cmd b/算法/learn/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/算法/learn/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/算法/learn/pom.xml b/算法/learn/pom.xml new file mode 100644 index 0000000..12b22fa --- /dev/null +++ b/算法/learn/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.6 + + + com.learn + learn + 0.0.1-SNAPSHOT + learn + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/算法/learn/src/main/java/com/learn/learn/HouseRobber1.java b/算法/learn/src/main/java/com/learn/learn/HouseRobber1.java new file mode 100644 index 0000000..b750a68 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/HouseRobber1.java @@ -0,0 +1,23 @@ +package com.learn.learn; + +public class HouseRobber1 { + public int rob(int[] nums) { + if (nums==null||nums.length==0){ + return 0; + } + // 辅助数组,用来记录中间过程 + int[] sum = new int[nums.length]; + sum[0]=nums[0]; + if (nums.length==1){ + return nums[0]; + } + sum[1] = Math.max(nums[0],nums[1]); + if (nums.length==2){ + return sum[1]; + } + for (int i=2;i= nums.length) { + return 0; + } + // 记忆化搜索可以避免重叠子问题的重复运算 + if (memo[index] != -1) { + return memo[index]; + } + // 当前值和当前值后两项值中比较大的值。 + int res = 0; + for (int i = index; i < nums.length; i++) { + // 使用当前值 + int indexValue = nums[i] + tryRob(nums, i + 2,memo); + res = Math.max(res, indexValue); + } + memo[index] = res; + return res; + } + +} diff --git a/算法/learn/src/main/java/com/learn/learn/LearnApplication.java b/算法/learn/src/main/java/com/learn/learn/LearnApplication.java new file mode 100644 index 0000000..03ee3e7 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/LearnApplication.java @@ -0,0 +1,13 @@ +package com.learn.learn; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LearnApplication { + + public static void main(String[] args) { + SpringApplication.run(LearnApplication.class, args); + } + +} diff --git a/算法/learn/src/main/java/com/learn/learn/PatchingArray.java b/算法/learn/src/main/java/com/learn/learn/PatchingArray.java new file mode 100644 index 0000000..6316fc7 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/PatchingArray.java @@ -0,0 +1,114 @@ +package com.learn.learn; + +import java.util.*; +import java.util.stream.Collectors; + +/* +给定一个已排序的正整数数组 nums ,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。 + +请返回 满足上述要求的最少需要补充的数字个数 。 + +来源:力扣(LeetCode) +链接:https://leetcode-cn.com/problems/patching-array +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ +public class PatchingArray { + + public static void main(String[] args) { + int [] arr = {1,3}; + System.out.println(minPatches(arr,6)); + } + + public static int minPatches(int[] nums, int n) { + int result =0; + // 边界 + if (n==0){ + return 0; + } + // nums为空或者长度为0则需要补充数据 + // 从0-n,判断哪些数据没有满足 + boolean dp[]=new boolean[n+1]; + // 原始数据 + for (int num : nums) { + dp[num] = true; + } + List different = judeIsSame(dp); + // 判断是否相同 + if (different.size()==0){ + return result; + } + // 添加所有累加结果,每个值要与不要。 + addSum(dp,nums,0,0); + different = judeIsSame(dp); + if (different.size()==0){ + return result; + } + // 补充参数,不同参数相差为几则需要几个。 + // 相差数相同则为一个 + Set setSumDifferent = new HashSet<>(); + for (int i = 1; i < different.size(); i++) { + setSumDifferent.add(different.get(i)-different.get(i-1)); + } + // 几个数的和可以的出第三者则删除第三者。 + List objects = new ArrayList<>(setSumDifferent); + List need = new ArrayList<>(); + getSumDifferent(objects,need,0,1,2); + return new HashSet<>(need).size(); + } + + public static void getSumDifferent(List objects,List need,int fist,int next,int current){ + if (objects.size()==1){ + need.add(objects.get(0)); + return; + } + if (objects.size()==2){ + need.add(objects.get(0)); + need.add(objects.get(1)); + return; + } + if (current==objects.size()){ + return; + } + // 不用object2 + need.add(objects.get(fist)); + need.add(objects.get(next)); + if (objects.get(fist)+objects.get(next)==objects.get(current)){ + objects.remove(current); + getSumDifferent(objects,need,++fist,++next,++current); + } + if (objects.get(fist)+objects.get(next)>objects.get(current)){ + need.add(objects.get(current)); + getSumDifferent(objects,need,fist,next,++current); + } + if (objects.get(fist)+objects.get(next) judeIsSame(boolean dp[]){ + List falseList = new ArrayList<>(); + for (int i = 1; i < dp.length; i++) { + if (!dp[i]){ + falseList.add(i); + } + } + return falseList; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/dachang/eleven/PalindromePartitioningll.java b/算法/learn/src/main/java/com/learn/learn/dachang/eleven/PalindromePartitioningll.java new file mode 100644 index 0000000..30d6154 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/dachang/eleven/PalindromePartitioningll.java @@ -0,0 +1,74 @@ +package com.learn.learn.dachang.eleven; + +import java.util.ArrayList; +import java.util.List; + +public class PalindromePartitioningll { + + public static int minCut(String s){ + if (s==null||s.length()==0){ + return 0; + } + char[] str = s.toCharArray(); + int n=str.length; + boolean[][] checkMap = createCheckMap(str,n); + int[] dp = new int [n+1]; + dp[n]=0; + for (int i=n-1;i>=0;i--){ + if (checkMap[i][n-1]){ + dp[i]=1; + }else { + int next = Integer.MAX_VALUE; + for (int j=i;j=0;i--){ + for (int j=i+2;j minCutOneWay(String s){ + List ans = new ArrayList<>(); + if (s==null||s.length()<2){ + ans.add(s); + }else { + char[] str = s.toCharArray(); + int n = str.length; + boolean[][] checkMap = createCheckMap(str,n); + int[] dp = new int [n+1]; + dp[n]=0; + for (int i = n-1;i>=0;i--){ + if (checkMap[i][n-1]){ + dp[i]=1; + }else { + int next = Integer.MAX_VALUE; + for (int j=i;j0&&m[i][j]0&&m[i][j]0&&m[i][j]0&&m[i][j]> dp){ + // 用缓存 + if (dp.containsKey(index)&&dp.get(index).containsKey(rest)){ + return dp.get(index).get(rest); + } + int result=0; + if (index==arr.length){ + result= (rest==0?1:0); + }else { + result = process1(arr,index+1,rest-arr[index])+process1(arr,index+1,rest+arr[index]); + } + // 建立缓存 + if (!dp.containsKey(index)){ + dp.putAll(new HashMap<>()); + } + dp.get(index).put(rest,result); + return result; + } + + public int process3(int [] arr,int target){ + int sum = 0; + for (int n:arr){ + sum+=n; + } + return sum>1); + } + public int subSet(int[] nums,int s){ + int[]dp = new int[s+1]; + dp[0]=1; + for (int n:nums){ + for (int i = s;i>=n;i--){ + dp[i]+=dp[i-n]; + } + } + return dp[s]; + } + + +} diff --git a/算法/learn/src/main/java/com/learn/learn/dachang/one/Third.java b/算法/learn/src/main/java/com/learn/learn/dachang/one/Third.java new file mode 100644 index 0000000..bd543f9 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/dachang/one/Third.java @@ -0,0 +1,13 @@ +package com.learn.learn.dachang.one; + +public class Third { + public int getTwo(int start){ + start--; + start|=(start>>>1); + start|=start|(start>>>2); + start|=start|(start>>>4); + start|=start|(start>>>8); + start|=start|(start>>>16); + return start<0?1:start+1; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/dachang/second/Fourth.java b/算法/learn/src/main/java/com/learn/learn/dachang/second/Fourth.java new file mode 100644 index 0000000..e8cbe4e --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/dachang/second/Fourth.java @@ -0,0 +1,29 @@ +package com.learn.learn.dachang.second; + +public class Fourth { + public static int maxMoney(int[][] income){ + if (income==null||income.length<2||(income.length&1)!=0){ + return 0; + } + int n=income.length; + int m=n>>1; + return process(income,0,m); + } + // index .....所有司机,往A和B区域分配 + // A区域还有rest个名额 + // 返回把index司机分配完,最终A和B区域相同, + public static int process(int[][] income,int index,int rest){ + if(index==income.length){ + return 0; + } + if (income.length-index ==rest){ + return income[index][0]+process(income,index+1,rest-1); + } + if (rest==0){ + return income[index][1]+process(income,index+1,rest); + } + int p1 = income[index][0]+process(income,index+1,rest-1); + int p2 = income[index][1]+process(income,index+1,rest); + return Math.max(p1,p2); + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/dachang/seventeen/DistinctSubsequencesIi.java b/算法/learn/src/main/java/com/learn/learn/dachang/seventeen/DistinctSubsequencesIi.java new file mode 100644 index 0000000..a03f65c --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/dachang/seventeen/DistinctSubsequencesIi.java @@ -0,0 +1,41 @@ +package com.learn.learn.dachang.seventeen; + +import java.util.HashMap; + +public class DistinctSubsequencesIi { + public static int process(String s){ + if (s==null||s.length()==0){ + return 0; + } + char[] str = s.toCharArray(); + HashMap map = new HashMap<>(); + int all = 1; + for (char x:str){ + int newAdd = all; + int curAll = all+newAdd-(map.containsKey(x)?map.get(x)-1:0); + all = curAll; + map.put(x,newAdd); + } + return all; + } + + public int distinctSubseqII(String s) { + if (s==null||s.length()==0){ + return 0; + } + char[] str = s.toCharArray(); + int i = 1000000007; + HashMap map = new HashMap<>(); + int all = 1; + for (char x:str){ + int newAdd = all; + int curAll = all; + curAll = (curAll+newAdd)%i; + curAll=(curAll-(map.containsKey(x)?map.get(x):0)+i)%i; + all = curAll; + map.put(x,newAdd); + } + return all-1; + } + +} diff --git a/算法/learn/src/main/java/com/learn/learn/dachang/seventeen/StringST.java b/算法/learn/src/main/java/com/learn/learn/dachang/seventeen/StringST.java new file mode 100644 index 0000000..b956ec3 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/dachang/seventeen/StringST.java @@ -0,0 +1,24 @@ +package com.learn.learn.dachang.seventeen; + +public class StringST { + public static int dp(String s1,String t1){ + char[] s = s1.toCharArray(); + char[] t = t1.toCharArray(); + int n=s.length; + int m=t.length; + int[][] dp = new int[n][m]; + dp[0][0] = s[0]==t[0]?1:0; + for (int i = 1;i0){ + max +=i; + }else { + min+=i; + } + } + if (k>max||k0){ + max +=i; + }else { + min+=i; + } + } + if (k>max||k=a且=b时,你将失败 + * 返回获胜的概率,给定的参数为N,a,b + */ +public class Code1NCardsABWin { + + + + + public static double f2(int n,int a,int b){ + if (n<1||a>=b||a<0||b<0){ + return 0; + } + // 拿牌最终结果必定在a-b中间 + if (b-a>=n){ + return 1.0; + } + // 所有参数都合法,并且可能出现失败 + return p2(0,n,a,b); + } + + public static double p2(int cur,int n,int a,int b){ + if (cur>a&&curb){ + return 0; + } + double w = 0.0; + for (int i=1;i=17&&cur<=21){ + return 1; + } + if (cur>=21){ + return 0.0; + } + double w = 0.0; + for (int i = 1;i<10;i++){ + // 加每张牌获胜的概率 + w+=p1(cur+i); + } + // 求平均 + return w/10; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/dachang/twentyfour/Code04_Painting.java b/算法/learn/src/main/java/com/learn/learn/dachang/twentyfour/Code04_Painting.java new file mode 100644 index 0000000..3541da1 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/dachang/twentyfour/Code04_Painting.java @@ -0,0 +1,72 @@ +package com.learn.learn.dachang.twentyfour; + +import java.util.ArrayList; +import java.util.List; + +public class Code04_Painting { + public static int minColors(int N, int M) { + // 颜色数量是i + for (int i = 2; i < N * M; i++) { + int[][] matrix = new int[N][M]; + // 下面这一句可知,需要的最少颜色数i,一定是N*M的某个因子 + if ((N * M) % i == 0 && can(matrix, N, M, i)) { + return i; + } + } + return N * M; + } + + // 在matrix上染色,返回只用pNum种颜色是否可以做到要求 + public static boolean can(int[][] matrix, int N, int M, int pNum) { + int all = N * M; + int every = all / pNum; + // 使用颜料总数 + ArrayList rest = new ArrayList<>(); + rest.add(0); + for (int i = 1; i <= pNum; i++) { + rest.add(every); + } + return process(matrix, N, M, pNum, 0, 0, rest); + } + + public static boolean process(int[][] matrix, int N, int M, int pNum, int row, int col, List rest) { + // 从第0行第0列开始,到N时结束,到M时进行下一行. + if (row == N) { + return true; + } + if (col == M) { + return process(matrix, N, M, pNum, row + 1, 0, rest); + } + // 为0表示没有颜色,第0列左边没有颜色,第0行上一行没有颜色 + int left = col == 0 ? 0 : matrix[row][col - 1]; + int up = row == 0 ? 0 : matrix[row - 1][col]; + for (int color = 1; color <= pNum; color++) { + if (color != left && color != up && rest.get(color) > 0) { + int count = rest.get(color); + rest.set(color, count - 1); + matrix[row][col] = color; + if (process(matrix, N, M, pNum, row, col + 1, rest)) { + return true; + } + // 不成功恢复现场. + rest.set(color, count); + matrix[row][col] = 0; + } + } + return false; + } + + public static void main(String[] args) { + // 根据代码16行的提示,打印出答案,看看是答案是哪个因子 + for (int N = 2; N < 10; N++) { + for (int M = 2; M < 10; M++) { + System.out.println("N = " + N); + System.out.println("M = " + M); + System.out.println("ans = " + minColors(N, M)); + System.out.println("==========="); + } + } + // 打印答案,分析可知,是N*M最小的质数因子,原因不明,也不重要 + // 反正打表法猜出来了 + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/fourty/fourth/CanIWinFirst.java b/算法/learn/src/main/java/com/learn/learn/tixi/fourty/fourth/CanIWinFirst.java new file mode 100644 index 0000000..64f2c2a --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/fourty/fourth/CanIWinFirst.java @@ -0,0 +1,49 @@ +package com.learn.learn.tixi.fourty.fourth; +// https://leetcode.com/problems/can-i-win/submissions/ +public class CanIWinFirst { +// 对方先面对小于等于0的数字则自己赢. + public boolean canIWin(int chose,int total){ + // 题目要求上来就是0,则先手赢 + if(total<=0){ + return true; + } + // 所有数字和小于提供 + if ((chose*(chose+1)>>1)>1)0){ + for (int i = 1;i<=chose;i++){ + if (((1< set, int start){ + int cityNum = 1; + for (int i=0;i=range[0]&&index<=range[1]){ + return arr[index]; + }else if (indexrange[1]){ + l=range[1]+1; + }else { + return pivot; + } + } + return arr[l]; + } + + // 返回左右范围 + private static int[] partition(int[] arr, int l, int r, int pivot) { + return null; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/ArrToString.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/ArrToString.java new file mode 100644 index 0000000..779dbe0 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/ArrToString.java @@ -0,0 +1,144 @@ +package com.learn.learn.tixi.twentieth; + +import java.util.HashMap; +// https://leetcode.com/problems/stickers-to-spell-word/ +public class ArrToString { + public static int minStickers1(String[] stickers,String target){ + int ans = process1(stickers,target); + return ans==Integer.MAX_VALUE?-1:ans; + } + + /* + 所有贴纸stickers,每一张贴纸都有无穷张 + target + 最少张数 + */ + private static int process1(String[] stickers, String target) { + if (target.length()==0){ + return 0; + } + int min = Integer.MAX_VALUE; + // 每张贴纸被剪无数次还剩多少 + for (String first:stickers){ + String rest = minus(target,first); + if (rest.length()!=target.length()){ + min=Math.min(min,process1(stickers,rest)); + } + } + return min+(min == Integer.MAX_VALUE?0:1); + } + + private static String minus(String s1, String s2) { + char[] str1 = s1.toCharArray(); + char[] str2 = s2.toCharArray(); + int[] count = new int[26]; + for (char cha:str1){ + count[cha-'a']++; + } + for (char cha:str2){ + count[cha-'a']--; + } + StringBuilder builder = new StringBuilder(); + for (int i = 0;i<26;i++){ + if (count[i]>0){ + for (int j=0;j所有的贴纸 + // 每一种贴纸都有无穷张 + // 返回搞定target的最少张数 + public static int process2(int[][] stickers,String t){ + if (t.length()==0){ + return 0; + } + char[] target=t.toCharArray(); + int[] tcounts= new int[26]; + for (char cha:target){ + tcounts[cha-'a']++; + } + int n = stickers.length; + int min = Integer.MAX_VALUE; + for (int i = 0;i0){ + StringBuilder builder = new StringBuilder(); + for (int j=0;j<26;j++){ + if (tcounts[j]>0){ + int nums = tcounts[j]-sticker[j]; + for (int k = 0;k dp = new HashMap<>(); + dp.put("",0); + int ans = process3(counts,target,dp); + return ans == Integer.MAX_VALUE?-1:ans; + } + + private static int process3(int[][] stickers, String t, HashMap dp) { + if (dp.containsKey(t)){ + return dp.get(t); + } + char[] target = t.toCharArray(); + int[] tcounts = new int[26]; + for (char cha:target){ + tcounts[cha-'a']++; + } + int n=stickers.length; + int min = Integer.MAX_VALUE; + for (int i=0;i0){ + StringBuilder builder = new StringBuilder(); + for (int j= 0 ;j<26;j++){ + if (tcounts[j]>0){ + int nums= tcounts[j]-sticker[j]; + for (int k=0;k=0;index--){ + for (int rest = 0;rest<=bag;rest++){ + int p1 = dp[index+1][rest]; + int p2=0; + int next = rest-w[index]<0?-1:dp[index+1][rest-w[index]]; + if (next!=-1){ + p2 = v[index]+next; + } + dp[index][rest]=Math.max(p1,p2); + } + } + + return dp[0][bag]; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/LongestCommonSubsequence.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/LongestCommonSubsequence.java new file mode 100644 index 0000000..5807c6c --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/LongestCommonSubsequence.java @@ -0,0 +1,69 @@ +package com.learn.learn.tixi.twentieth; +// https://leetcode.cn/problems/longest-common-subsequence/ +public class LongestCommonSubsequence { + + public static int longestCommonSubsequence(String s1,String s2){ + if (s1==null||s2==null||s1.length()==0||s2.length()==0){ + return 0; + } + char[] str1 = s1.toCharArray(); + char[] str2 = s2.toCharArray(); + return process1(str1,str2,str1.length-1,str2.length-1); + } + public static int process1(char[] str1,char[] str2,int i,int j){ + if (i==0&&j==0){ + return str1[i]==str2[j]?1:0; + }else if (i==0){ + if (str2[j]==str1[i]){ + return 1; + }else { + process1(str1,str2,i,j-1); + } + }else if (j==0){ + if (str2[j]==str1[i]){ + return 1; + }else { + process1(str1,str2,i-1,j); + } + }else { + // 样本对应,结尾该如何组织可能性 + // 不以i结尾可能以j结尾, + int p1 = process1(str1,str2,i-1,j); + // 即以i结尾也不以j结尾, + int p2 = process1(str1,str2,i,j-1); + // 即以i结尾又以j结尾 + int p3 = str1[i]==str2[j]?(1+process1(str1,str2,i-1,j-1)):0; + return Math.max(p1,Math.max(p2,p3)); + } + return 0; + } + + public static int longestCommonSubsequence2(String s1,String s2){ + if (s1==null||s2==null||s1.length()==0||s2.length()==0){ + return 0; + } + char[] str1 = s1.toCharArray(); + char[] str2 = s2.toCharArray(); + int n= str1.length; + int m = str2.length; + int [][] dp = new int[n][m]; + dp[0][0]=str1[0]==str2[0]?1:0; + for (int j=1;j=0;i--){ + if (strChar[i]!='0'){ + int ways=dp[i+1]; + if (i + 1 < strChar.length &&(strChar[i]-'0')*10+strChar[i+1]-'0'<27) { + ways+=dp[i+2]; + } + dp[i]=ways; + } + } + return dp[0]; + } + +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twenty/ninth/Manacher.java b/算法/learn/src/main/java/com/learn/learn/tixi/twenty/ninth/Manacher.java new file mode 100644 index 0000000..8d57e48 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twenty/ninth/Manacher.java @@ -0,0 +1,55 @@ +package com.learn.learn.tixi.twenty.ninth; + +/** + * @ClassName Manacher + * @Description + * @Author shixiaohua + * @Date 2022-07-15 22:20 + **/ +public class Manacher { + public static int manacher(String s){ + if (s==null||s.length()==0){ + return 0; + } + // 121aaaa2323aa -> #1#2#1#a#a#a#a#2#3#2#3#a#a# + char[] str = manacherString(s); + // 回文半径大小 + int[] pArr = new int[str.length]; + int c = -1; + // 讲述中:R代表最右的扩成功位置.coding :最右的扩成功的位置的,再下一个位置 + int r = -1; + int max = Integer.MIN_VALUE; + for (int i =0;i=r + // i位置扩出来的答案,i位置扩的区域,至少是多大. + + // 如果i在r外,至少回文半径1 + // 如果i在r内,如果i`在LR内在回文为i=i` + // 如果i在r内,如果i`在LR外在回文为i=r + // 如果i在r内,如果i`压线i->r=(i`) + // 2*c-i = i` + // 那个区域不用校验 + pArr[i]=r>i?Math.min(pArr[2*c-i],r-i):1; + // 新的校验 + while (i+pArr[i]-1){ + if (str[i+pArr[i]]==str[i-pArr[i]]){ + pArr[i]++; + }else { + break; + } + } + if (i+pArr[i]>r){ + r=i+pArr[i]; + c=i; + } + max = Math.max(max,pArr[i]); + } + // 121 #1#2#1# 4-1 + // 1221 #1#2#2#1# 5-1 + return max-1; + } + + private static char[] manacherString(String s) { + return s.toCharArray(); + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twenty/seven/KMP.java b/算法/learn/src/main/java/com/learn/learn/tixi/twenty/seven/KMP.java new file mode 100644 index 0000000..80ae1ec --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twenty/seven/KMP.java @@ -0,0 +1,54 @@ +package com.learn.learn.tixi.twenty.seven; + +/** + * @ClassName KMP + * @Description + * @Author shixiaohua + * @Date 2022-07-14 22:38 + **/ +public class KMP { + public static int getIndexOf(String s1,String s2){ + if (s1==null||s2==null||s2.length()<1||s1.length()0){ + // 如果不同跳到前一次记录相同个数的位置比较 + cn = next[cn]; + }else { + next[i++]=0; + } + } + return next; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentyfirst/CoffeeWash.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentyfirst/CoffeeWash.java new file mode 100644 index 0000000..430896f --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentyfirst/CoffeeWash.java @@ -0,0 +1,58 @@ +package com.learn.learn.tixi.twentyfirst; + +/** + * @ClassName CoffeeWash + * @Description + * @Author ZhaoLiXian + * @Date 2022-06-28 21:29 + **/ +public class CoffeeWash { + + public static void main(String[] args) { + //bestTime() + } + // drinks 所有杯子可以开始洗的时间 + // wash 单杯洗干净的时间(串行) + // air 挥发干净的时间(并行) + // free 洗的机器什么时候可用 + // drinks[index...]都变干净,最早的结束时间(返回) + public static int bestTime(int[] drinks,int wash,int air,int index,int free){ + if (index == drinks.length){ + return 0; + } + // index 号杯子 决定洗 + int selfClean1 = Math.max(drinks[index],free)+wash; + int restClean1 = bestTime(drinks,wash,air,index+1,selfClean1); + int p1 = Math.max(selfClean1,restClean1); + // index 号杯子 决定挥发 + int selfClean2 = drinks[index]+air; + int restClean2 = bestTime(drinks,wash,air,index+1,free); + int p2=Math.max(selfClean2,restClean2); + return Math.min(p1,p2); + } + + public static int bestTimeDp(int[] drinks,int wash,int air){ + int n = drinks.length; + int maxFree = 0; + for (int i = 0;i=0;index --){ + for (int free = 0;free<=maxFree;free++){ + int selfClean1 = Math.max(drinks[index],free)+wash; + if (selfClean1>maxFree){ + continue; + } + int restClean1 = dp[index+1][selfClean1]; + int p1 = Math.max(selfClean1,restClean1); + + int selfClean2 = drinks[index]+air; + int restClean2 = dp[index+1][free]; + int p2=Math.max(selfClean2,restClean2); + dp[index][free]=Math.min(p1,p2); + } + } + return dp[0][0]; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentyfirst/Palindromic.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentyfirst/Palindromic.java new file mode 100644 index 0000000..3148790 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentyfirst/Palindromic.java @@ -0,0 +1,66 @@ +package com.learn.learn.tixi.twentyfirst; + +/** + * @ClassName Palindromic + * @Description + * @Author + * @Date 2022-06-26 16:26 + **/ +// https://leetcode.cn/problems/longest-palindromic-subsequence/ +public class Palindromic { + public static int lpsl(String s) { + if (s == null || s.length() == 0) { + return 0; + } + char[] str = s.toCharArray(); + return f(str, 0, str.length - 1); + } + + public static int f(char[] str, int l, int r) { + if (l == r) { + return 0; + } + if (l == r - 1) { + return str[l] == str[r] ? 2 : 1; + } + int p1 = f(str, l + 1, r - 1); + int p2 = f(str, l, r - 1); + int p3 = f(str, l + 1, r); + int p4 = str[l] != str[r] ? 0 : (2 + f(str, l + 1, r - 1)); + return Math.max(Math.max(p1, p2), Math.max(p3, p4)); + } + + public static int lpsl2(String s) { + if (s == null || s.length() == 0) { + return 0; + } + char[] str = s.toCharArray(); + int n = str.length; + // l 0....n-1 + // r 0....n-1 + int[][] dp = new int[n][n]; + dp[n - 1][n - 1] = 1; + for (int i = 0; i < n - 1; i++) { + dp[i][i] = 1; + dp[i][i + 1] = str[i] == str[i + 1] ? 2 : 1; + } +// for (int l = n - 3; l >= 0; l--) { +// for (int r = l + 2; r < n; r++) { +// int p1 = dp[l + 1][r - 1]; +// int p2 = dp[l][r - 1]; +// int p3 = dp[l + 1][r]; +// int p4 = str[l] != str[r] ? 0 : (2 + dp[l + 1][r - 1]); +// dp[l][r] = Math.max(Math.max(p1, p2), Math.max(p3, p4)); +// } +// } + for (int l = n - 3; l >= 0; l--) { + for (int r = l + 2; r < n; r++) { + dp[l][r]=Math.max(dp[l][r-1],dp[l+1][r]); + if (str[l]==str[r]){ + dp[l][r]=Math.max(dp[l][r],2+dp[l+1][r-1]); + } + } + } + return dp[0][n - 1]; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentyforth/NQueens.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentyforth/NQueens.java new file mode 100644 index 0000000..3c3cb63 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentyforth/NQueens.java @@ -0,0 +1,47 @@ +package com.learn.learn.tixi.twentyforth; + +/** + * @ClassName NQueens + * @Description + * @Author ZhaoLiXian + * @Date 2022-07-08 20:05 + **/ +public class NQueens { + public static int num(int n){ + if (n<1){ + return 0; + } + int [] record = new int[n]; + return process(0,record,n); + } + + // 当前来到i行,一共n-1行 + // 在i行上放皇后,所有列都尝试 + // 必须要保证跟之前所有的皇后不打架 + // int[] record record[x]=y 之前的第x行的皇后,放在了y列上 + // 返回:不关心i以上发生了什么,i...后续有多少合法的方法数 + private static int process(int i, int[] record, int n) { + if (i==n){ + return 1; + } + int res = 0; + // i行皇后,放哪一列呢? j列 + for (int j=0;j>1); + } + + private static int process(int[] arr, int i, int rest) { + if (i==arr.length){ + return 0; + }else { + int p1=process(arr,i+1,rest); + int p2=0; + if (arr[i]<=rest){ + p2=arr[i]+process(arr,i+1,rest-arr[i]); + } + return Math.max(p1,p2); + } + } + + public static int db(int [] arr){ + if (arr==null||arr.length<2){ + return 0; + } + int sum = 0; + for (int num :arr){ + sum+=num; + } + sum /=2; + int n=arr.length; + int[][] dp = new int[n+1][sum+1]; + for (int i=n-1;i>=0;i--){ + for (int rest=0;rest<=sum;rest++){ + int p1=dp[i+1][rest]; + int p2=0; + if (arr[i]<=rest){ + p2=arr[i]+dp[i+1][rest-arr[i]]; + } + dp[i][rest]= Math.max(p1,p2); + } + } + return dp[0][sum]; + } + + + +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentyforth/SplitSumClosedHalf.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentyforth/SplitSumClosedHalf.java new file mode 100644 index 0000000..f47aef5 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentyforth/SplitSumClosedHalf.java @@ -0,0 +1,92 @@ +package com.learn.learn.tixi.twentyforth; + +/** + * @ClassName SplitSumClosedHalf + * @Description + * @Author shixiaohua + * @Date 2022-07-07 18:57 + **/ +public class SplitSumClosedHalf { + + public static int right(int[] arr){ + if (arr==null||arr.length<2){ + return 0; + } + int sum = 0; + for (int num :arr){ + sum+=num; + } + if ((arr.length&1)==0){ + return process(arr,0,arr.length/2,sum>>1); + }else { + return Math.max(process(arr,0,arr.length/2,sum>>1),process(arr,0,arr.length/2+1,sum>>1)); + } + + } + + + // arr[i....] 自由选择,挑选的个数一定要是picks个,累加和<=rest,离rest最近的返回 + private static int process(int[] arr, int i, int picks, int rest) { + if (i==arr.length){ + return rest==0?0:-1; + }else { + int p1=process(arr,i+1,picks,rest); + int p2=-1; + if (arr[i]<=rest){ + int next = process(arr,i+1,picks-1,rest-arr[i]); + if (next!=-1){ + p2=arr[i]+next; + } + } + return Math.max(p1,p2); + } + } + + public static int dp(int [] arr){ + if (arr==null||arr.length<2){ + return 0; + } + int sum = 0; + for (int num :arr){ + sum+=num; + } + sum/=2; + int n = arr.length; + int m = (n+1)/2; + + int[][][] dp = new int[n+1][m+1][sum+1]; + for (int i=0;i<=n+1;i++){ + for (int j=0;j<=m+1;j++){ + for (int k=0;k<=sum+1;k++){ + dp[i][j][k]=-1; + } + } + } + for (int rest = 0; rest <= sum; rest++) { + dp[n][0][rest]=0; + } + for (int i = n-1;i>=0;i--){ + for (int picks = 0;picks<=m;picks++){ + for (int rest = 0;rest<=sum;rest++){ + int p1=dp[i+1][picks][rest]; + int p2=-1; + if (picks-1>=0 && arr[i]<=rest){ + int next = dp[i+1][picks-1][rest-arr[i]]; + if (next!=-1){ + p2=arr[i]+next; + } + } + dp[i][picks][rest]= Math.max(p1,p2); + } + } + } + + + + if ((arr.length&1)==0){ + return dp[0][arr.length/2][sum]; + }else { + return Math.max(dp[0][arr.length/2][sum],dp[0][(arr.length/2)+1][sum]); + } + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentysecond/BobDie.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentysecond/BobDie.java new file mode 100644 index 0000000..7b7a13c --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentysecond/BobDie.java @@ -0,0 +1,41 @@ +package com.learn.learn.tixi.twentysecond; + +import java.sql.PreparedStatement; + +/** + * @ClassName BobDie + * @Description + * @Author ZhaoLiXian + * @Date 2022-07-01 19:44 + **/ +public class BobDie { + public static double livePosibility1(int row,int col,int k,int n,int m){ + return (double)process(row,col,k,n,m)/Math.pow(4,k); + } + + /** + * description: 目前位置,row,col,剩余步数rest,走完获得1个生存点. + * date: 2022-07-01 19:51 + * author: Xiaohua XH4 Shi + * @param row + * @param col + * @param rest + * @param n + * @param m + * @return long + */ + private static long process(int row, int col, int rest, int n, int m) { + // 剪枝 + if (row<0||row==n||col<0||col==m){ + return 0; + } + if (rest ==0){ + return 1; + } + long up = process(row-1,col,rest-1,n,m); + long down = process(row+1,col,rest-1,n,m); + long left = process(row,col-1,rest-1,n,m); + long right = process(row,col+1,rest-1,n,m); + return up+down+left+right; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentysecond/Money.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentysecond/Money.java new file mode 100644 index 0000000..d7d76ab --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentysecond/Money.java @@ -0,0 +1,59 @@ +package com.learn.learn.tixi.twentysecond; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ClassName Money + * @Description + * @Author ZhaoLiXian + * @Date 2022-06-29 22:38 + **/ +public class Money { + public static class Info{ + public int[] coins; + public int[] zhangs; + public Info(int[]coins,int[]zhangs){ + coins= this.coins; + zhangs = this.zhangs; + } + } + // 词频统计 + public static Info getInfo(int[] arr){ + HashMap counts = new HashMap<>(); + for (int value:arr){ + if (!counts.containsKey(value)){ + counts.put(value,1); + }else { + counts.put(value,counts.get(value)+1); + } + } + int n = counts.size(); + int[] coins = new int[n]; + int[] zhangs = new int[n]; + int index = 0; + for (Map.Entry entry:counts.entrySet()){ + coins[index]=entry.getKey(); + zhangs[index++]=entry.getValue(); + } + return new Info(coins,zhangs); + } + public static int coinsWay(int[] arr,int aim){ + if (arr ==null||arr.length==0||aim<0){ + return 0; + } + Info info = getInfo(arr); + return process(info.coins,info.zhangs,0,aim); + } + + private static int process(int[] coins, int[] zhangs, int index, int rest) { + if (index == coins.length){ + return rest ==0?1:0; + } + int ways = 0; + for (int zhang =0;zhang*coins[index]<=rest && zhang<=zhangs[index];zhang++){ + ways+=process(coins,zhangs,index+1,rest-(zhang*coins[index])); + } + return ways; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentythird/KillMonster.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentythird/KillMonster.java new file mode 100644 index 0000000..7012d82 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentythird/KillMonster.java @@ -0,0 +1,113 @@ +package com.learn.learn.tixi.twentythird; + +/** + * @ClassName KillMonster + * @Description + * @Author ZhaoLiXian + * @Date 2022-07-01 21:38 + **/ +public class KillMonster { + public static double killMonster(int n, int m, int k) { + if (n < 1 || m < 1 || k < 1) { + return 0; + } + long all = (long) Math.pow(m + 1, k); + long kill = process1(100, 9, 10); + return (double) ((double) kill / (double) all); + } + + // 怪兽还剩N滴血 + // 每次伤害在[0~M]范围上 + // 还有K次可以砍 + // 返回砍死的情况 + public static long process1(int hp, int m, int time) { + if (hp <= 0) { + return (long) Math.pow(m + 1, time); + } + if (time == 0) { + return hp <= 0 ? 1 : 0; + } + long ways = 0; + // 从0开始到m等概率 + for (int i = 0; i <= m; i++) { + ways += process1(hp - i, m, time - 1); + } + return ways; + } + + // 可变参数 n,time + public static double dp1(int n, int m, int k) { + if (n < 1 || m < 1 || k < 1) { + return 0; + } + long all = (long) Math.pow(m + 1, k); + // 从0-n长度为n+1 + long[][] dp = new long[k + 1][n + 1]; + dp[0][0] = 1; + for (int times = 1; times <= k; times++) { + dp[times][0] = (long) Math.pow(m + 1, times); + for (int hp = 1; hp <= n; hp++) { + long ways = 0; + for (int i = 0; i <= m; i++) { + if (hp - i >= 0) { + ways += dp[times - 1][hp - 1]; + } else { + ways += (long) Math.pow(m + 1, times - 1); + } + } + dp[times][hp] = ways; + } + } + + + // 看主函数怎么调用的 + long kill = dp[k][n]; + return (double) ((double) kill / (double) all); + } + + // 枚举行为到依赖关系 可变参数 n,time + public static double dp2(int n, int m, int k) { + if (n < 1 || m < 1 || k < 1) { + return 0; + } + long all = (long) Math.pow(m + 1, k); + // 从0-n长度为n+1 + long[][] dp = new long[k + 1][n + 1]; + dp[0][0] = 1; + for (int times = 1; times <= k; times++) { + dp[times][0] = (long) Math.pow(m + 1, times); + for (int hp = 1; hp <= n; hp++) { + dp[times][hp] = dp[times][hp - 1] + dp[times - 1][hp]; + if (hp - 1 - m >= 0) { + dp[times][hp] -= dp[times - 1][hp - 1 - m]; + } else { + dp[times][hp] -= (long) Math.pow(m + 1, times - 1); + } + } + } + // 看主函数怎么调用的 + long kill = dp[k][n]; + return (double) ((double) kill / (double) all); + } + + public static void main(String[] args) { + int nMax = 10; + int mMax = 10; + int kMax = 10; + int testTime = 200; + System.out.println("测试开始"); + for (int i=0;i=0;index--){ + for (int rest = 0;rest<=aim;rest++){ + int ans = Integer.MAX_VALUE; + for (int zhang = 0;zhang*arr[index]<=rest;zhang ++){ + int next = dp[index+1][rest-zhang*arr[index]]; + if (next!=Integer.MAX_VALUE){ + ans = Math.min(ans,zhang+next); + } + } + dp[index][rest]=ans; + } + } + return dp[0][aim]; + } + public static int dp2(int [] arr,int aim){ + if (aim==0){ + return 0; + } + int n = arr.length; + int[][] dp = new int[n+1][aim+1]; + dp[n][0] = 0; + for (int j=1;j<=aim;j++){ + dp[n][j]=Integer.MAX_VALUE; + } + for (int index=n-1;index>=0;index--){ + for (int rest = 0;rest<=aim;rest++){ + dp[index][rest]= dp[index+1][rest]; + if (rest-arr[index]>=0 + && dp[index][rest-arr[index]]!=Integer.MAX_VALUE){ + dp[index][rest]=Math.min(dp[index][rest],dp[index][rest-arr[index]]+1); + } + } + } + return dp[0][aim]; + } +} diff --git a/算法/learn/src/main/resources/application.properties b/算法/learn/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/算法/learn/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/算法/learn/src/test/java/com/learn/learn/LearnApplicationTests.java b/算法/learn/src/test/java/com/learn/learn/LearnApplicationTests.java new file mode 100644 index 0000000..2344471 --- /dev/null +++ b/算法/learn/src/test/java/com/learn/learn/LearnApplicationTests.java @@ -0,0 +1,15 @@ +package com.learn.learn; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class LearnApplicationTests { + // 小和问题,数组每个元素左边比他小的数和,最后总体相加 + // merge sort + // 左侧排序,左组小加和。 + @Test + void contextLoads() { + } + +} diff --git a/算法/learn/体系/10.排序总结、链表相关面试题.md b/算法/learn/体系/10.排序总结、链表相关面试题.md new file mode 100644 index 0000000..4db45b3 --- /dev/null +++ b/算法/learn/体系/10.排序总结、链表相关面试题.md @@ -0,0 +1,8 @@ + 快慢指针. + +回文 + +面试 + 1. 链表遍历与弹栈. +笔试 +2. 修改右边指针往回指,分别从左右 开始遍历查看是否相同. \ No newline at end of file diff --git a/算法/learn/体系/11.二叉树基本算法(上).md b/算法/learn/体系/11.二叉树基本算法(上).md new file mode 100644 index 0000000..54058fd --- /dev/null +++ b/算法/learn/体系/11.二叉树基本算法(上).md @@ -0,0 +1,8 @@ +单链表环问题. + ## 二叉树 + ### 先序 + 头左右 + ### 中序 + 左头右 + ### 后续 + 左右头 \ No newline at end of file diff --git a/算法/learn/体系/12.二叉树基本算法(下).md b/算法/learn/体系/12.二叉树基本算法(下).md new file mode 100644 index 0000000..5fac575 --- /dev/null +++ b/算法/learn/体系/12.二叉树基本算法(下).md @@ -0,0 +1,9 @@ +## 用队列栈实现宽度优先遍历 +1. 队列弹出一个car并打印 +2. car有左入左,有右入右. +## 用栈实现深度优先遍历. +1. 栈中弹出一个car并打印. +2. 有右入右,有做入左. + + + \ No newline at end of file diff --git a/算法/learn/体系/13.二叉树的基本算法+二叉树的递归套路.md b/算法/learn/体系/13.二叉树的基本算法+二叉树的递归套路.md new file mode 100644 index 0000000..9a160d5 --- /dev/null +++ b/算法/learn/体系/13.二叉树的基本算法+二叉树的递归套路.md @@ -0,0 +1,14 @@ +从一个节点开始,叶子节点都要,称作子树,否则称作拓扑. + +### 二叉树递归套路 +1. 假设以x节点为头,假设可以向x左树和x右树要任何信息 +2. 在上一步的假设下,讨论以x为头节点的数,得到答案的可能性 +3. 列出所有可能性后,确定到底需要向左树和右树要什么样的信息 +4. 把左树信息和右树信息求全集,就是任何一颗子树都需要返回的信息S +5. 递归函数返回S,每一颗子树都这么要求 +6. 写代码,在代码中考虑如何把左树信息和右树信息整合出整课数的信息 + + + +1. 思想边界提醒 +2. 代码模板化 \ No newline at end of file diff --git a/算法/learn/体系/14.贪心算法(上).md b/算法/learn/体系/14.贪心算法(上).md new file mode 100644 index 0000000..3b56df3 --- /dev/null +++ b/算法/learn/体系/14.贪心算法(上).md @@ -0,0 +1,2 @@ +理清楚问题,在做..declare问题. + \ No newline at end of file diff --git a/算法/learn/体系/15.贪心算法(下).md b/算法/learn/体系/15.贪心算法(下).md new file mode 100644 index 0000000..e69de29 diff --git a/算法/learn/体系/16.并查集及其相关题目.md b/算法/learn/体系/16.并查集及其相关题目.md new file mode 100644 index 0000000..b774468 --- /dev/null +++ b/算法/learn/体系/16.并查集及其相关题目.md @@ -0,0 +1,5 @@ + 并查集:两个是否是同一个,两个联合。 + 往上到不能再往上,找父类. + 并查集扫雷,感染并查集。 + + 先写整体逻辑后分开写各各子实现。 \ No newline at end of file diff --git a/算法/learn/体系/17.图.md b/算法/learn/体系/17.图.md new file mode 100644 index 0000000..e69de29 diff --git a/算法/learn/体系/18.认识一些经典递归过程.md b/算法/learn/体系/18.认识一些经典递归过程.md new file mode 100644 index 0000000..52b598a --- /dev/null +++ b/算法/learn/体系/18.认识一些经典递归过程.md @@ -0,0 +1,7 @@ +### 暴力递归 +1. 把问题转换为规模缩小了的同类问题的子问题. +2. 有明确的不需要继续进行递归的条件 +3. 有当得到了子问题的结果之后的决策过程 +4. 不记录每一个子问题的解. + +恢复现场 \ No newline at end of file diff --git a/算法/learn/体系/19.暴力递归到动态规划(一).md b/算法/learn/体系/19.暴力递归到动态规划(一).md new file mode 100644 index 0000000..6f6c399 --- /dev/null +++ b/算法/learn/体系/19.暴力递归到动态规划(一).md @@ -0,0 +1,9 @@ +记忆化搜索 +尝试策略,状态转移 + +自然智慧 + +### 问题1 + +给定一个整型数组arr,代表数值不同的纸牌排成一条线,玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左边或者最右边的纸牌,玩家A和玩家B都绝顶聪明,请返回最后获胜者的分数。[50,100,20,10] + diff --git a/算法/learn/体系/2.认识复杂度、对数器、二分法.md b/算法/learn/体系/2.认识复杂度、对数器、二分法.md new file mode 100644 index 0000000..fee7a6b --- /dev/null +++ b/算法/learn/体系/2.认识复杂度、对数器、二分法.md @@ -0,0 +1,44 @@ +# 认识复杂度、对数器、二分法或异运算 +1. 时间复杂度 +2. 额外空间复杂度 +3. 常数项,一个操作的执行时间不以具体样本量为转移(数组寻址),每次执行时间都是固定的时间。 +### 时间复杂度 +#### 选择排序 +1. n*(看+比)+1 +2. (n-1)* n*(看+比)+1 +3. (n-2)* n*(看+比)+1 +4. 2*(n+n-1+n-2+····+1)+n 看+比 2 +5. 2an平方+bn+n+c +6. 2an平方 +最高阶,选出最小的,从头开始放。 +#### 冒泡排序 +1. 相邻的两个比较,大的放后面,最大值在后面。 +2. n-1 +3. n-2 +4. n-3 +5. 1 +5. n平方 +#### 插入排序 +1. 最好n +2. 最差n平方 +#### 计算时间复杂度 +1. 按照最坏的情况来 +2. 拆分为一个个基本动作 +3. 如果数据量为n,看基本动作和n之间的关系。 +4. 只把高阶项留下,低阶项和常数项去除。 +### 常数项 +### 最优解 +1. 时间复杂度 +2. 空间复杂度 +#### 常数时间操作 +1. 常见算数操作 +2. 移位、位运算 +3. 复制、比较、自增、自减操作 +4. 数组寻址操作 +#### 非常数时间操作 +1、链表LinkedList +### 对数器 +### 局部最小值 +数据状况和问题本身梳理问题。 +二分排他性 +俩边开始找,根据趋势,二分处理。 \ No newline at end of file diff --git a/算法/learn/体系/20.暴力递归到动态规划(二).md b/算法/learn/体系/20.暴力递归到动态规划(二).md new file mode 100644 index 0000000..583a2f7 --- /dev/null +++ b/算法/learn/体系/20.暴力递归到动态规划(二).md @@ -0,0 +1,27 @@ +### 背包问题 +重量数组w[] +价值数据v[] +bag maxvalue int +自由挑选货物,让背包里装的货物最多 + +### 数字对应 +规定1对应A,2对应B,3对应C,·····,26对应Z, +那么一个数字字符串比如‘111’就可以转换为‘AAA’,‘KA’和‘AK’ +给定一个只有数字字符串组成的字符串str,返回对少中转换结果 +### 数组转字符串 +给定一个字符串str,给定一个字符串类型的数组arr, +出现的字符都是小写英文arr每一个字符串,代表一张贴纸, +你可以把当个字符剪开使用,目的是拼出来str来返回需要至少 +多少贴纸可以完成任务。 +例子:str="babac",arr={"ba","c","abcd"} +至少需要两张贴纸"ba"和"abcd",因为使用这两张贴纸, +把每一个字符串单独剪开,含有2个a、2个b、1个c。是可以 +拼出str的。所以返回2 +### 最长公共子序列 +样本对应模型: + +### 模型 +1. 从左往右尝试,要不要判断 +2. 范围尝试,开头和结尾 +3. 样本对应模型,结尾 +4. 业务限制模型 \ No newline at end of file diff --git a/算法/learn/体系/21.暴力递归到动态规划(三).md b/算法/learn/体系/21.暴力递归到动态规划(三).md new file mode 100644 index 0000000..c4f66c6 --- /dev/null +++ b/算法/learn/体系/21.暴力递归到动态规划(三).md @@ -0,0 +1,14 @@ +### 回文 +给定一个字符串str,返回这个字符串的最长回文子序列(不连续,子串连续)长度 +比如:str="a12b3c43def2ghi1kpm" +最长回文子序列是"1234321或者"123c321",返回长度7 +生成str的逆序串,两个最长的公共子序列就是所求结果. + + +### 咖啡机 +给定一个数组arr,arr[i]代表第i号咖啡机泡一杯咖啡的时间 +给定一个正数N,表示N个人等着咖啡机泡咖啡,每台咖啡机只能轮流泡咖啡 +只有一台咖啡机,一次只能洗一个杯子,时间耗费a,洗完才能洗下一杯 +每个咖啡杯也可以自己挥发干净,时间耗费b,咖啡杯可以并行挥发假设所有人拿到 +咖啡之后立即喝干净,返回从开始等到所有咖啡机变干净的最短时间 +三个参数:int[]arr,in N,int a,int b \ No newline at end of file diff --git a/算法/learn/体系/22.暴力递归到动态规划(四).md b/算法/learn/体系/22.暴力递归到动态规划(四).md new file mode 100644 index 0000000..835d6fb --- /dev/null +++ b/算法/learn/体系/22.暴力递归到动态规划(四).md @@ -0,0 +1,25 @@ +空间压缩技巧 + +给定一个二维数组matrix,一个人必须从左上角出发,最后到达有下角沿途只可以向下或者向右走,沿途的数字都累加就是距离 +累加和返回最小距离累加和. + +arr是货币数组,其中的值都是正数,再给定一个整数aim +每个值都认为是一张货币 +即便是值相同的货币也认为每一张都是不同的, +返回组成aim的方法数 +例如:arr={1,1,1},aim = 2; +第0个和第1个能组成2,第1个和第2个能组成2,第0个和第二个能组成2 +一共就3种方法,所以返回3. + +记忆化搜索,严格表结构 + +## 题目四 +arr是货币数组,其中的值都是正数,再给定一个正数aim. +每个值都认为是一张货币 +认为值相同的货币没有任何不同, +返回组成aim的方法数 +例如arr={1,2,1,1,2,1,2},aim = 4 +方法:1+1+1+1,1+1+2,2+2 +一共有三种方法返回3 + + \ No newline at end of file diff --git a/算法/learn/体系/23.暴力递归到动态规划(五).md b/算法/learn/体系/23.暴力递归到动态规划(五).md new file mode 100644 index 0000000..21976c8 --- /dev/null +++ b/算法/learn/体系/23.暴力递归到动态规划(五).md @@ -0,0 +1,4 @@ +枚举行为到依赖关系(依赖下一步),斜率优化. + +arr是面值数组,其中的值都是正数且没有重复.再给定一个正数aim.每个值都认为是一种面值, +且认为张数是无限的.返回组成aim的最小货币数 \ No newline at end of file diff --git a/算法/learn/体系/24.暴力递归到动态规划(六).md b/算法/learn/体系/24.暴力递归到动态规划(六).md new file mode 100644 index 0000000..ca40373 --- /dev/null +++ b/算法/learn/体系/24.暴力递归到动态规划(六).md @@ -0,0 +1,65 @@ +给定一个正整数数组arr,请把arr中所有的数分成两个集合,尽量让两个集合的累加和接近. +返回:最接近的情况下,较小集合的累加和. + + + +给定一个正整数数组arr,请把arr中所有的数分成两个集合, +如果arr长度为偶数,两个集合包含数的个数要一样多, +如果arr长度为奇数,两个集合包含数的个数必须只差一个 +请尽量让两个集合的累加和接近 +返回: +最接近的情况下,较小集合的累加和 + + + +## 总结 +什么暴力递归可以继续优化? +有重复调用同一个子问题的解,这种递归可以优化 +如果每一个子问题都是不同的解,无法优化也不用优化. + +暴力递归和动态规划的关系:某一个暴力递归,有解的重复调用,就可以把这个暴力递归优化成动态规划 +任何动态规划问题,都一定对应着某一个有重复过程的暴力递归 +但不是所有的暴力递归,都一定对应着动态规划. + +面试题和动态规划的关系 +解决一个问题,可能有很多尝试方法 +可能在很多尝试方法中,又有若干个尝试方法有动态规划的方式 +一个问题可能有若干种动态规划的解法. + +如何找到某个问题的动态规划方式 +设计暴力递归:重要原则+4中常见尝试模型!重点! +分析有没有重复解:套路解决 +用记忆搜索(缓存,搜索o1就是最优解否则表依赖)->用严格表结构实现动态规划:套路解决 +看看能否继续优化:套路解决 + +面试中暴力递归过程的原则 +1. 每一个可变参数的类型,一定不要比int类型更加复杂 +2. 原则1.可以违反,让类型突破到一维线性结构,那必须是单一可变参数 +3. 如果发现原则1.被违反,但不违反原则2.,只需要做记忆搜索即可 +4. 可变参数的个数,能少则少. + +知道了面试中设计暴力递归过程的原则,然后呢 +一定要逼自己找到不违反原则情况下的暴力尝试 +如果你找到暴力尝试,不符合原则,马上舍弃,找新的. +如果某个题目突破了设计原则,一定极难极难,面试中的概率低于5% + +暴力递归到动态规划的套路 +1. 你已经有了一个不违反原则的暴力递归,而且的确存在解的重复调用 +2. 找到那些参数的变化会影响返回值,对每一个列出变化范围 +3. 参数间的所有组合数量,意味着表大小 +4. 记忆化搜索的方法就是傻缓存,非常容易得到 +5. 规定好严格表的大小,分析位置的依赖顺序,然后从基础填写到最终解 +6. 对于有枚举行为的决策过程,进一步优化. + +动态规划的进一步优化 +1. 空间压缩 +2. 状态化简 +3. 四边形不等式 +4. 其他优化技巧 + +## N皇后问题 +在N*N的棋盘上要摆N个皇后,要求任何两个皇后不同行,不同列,也不在同一条斜线上 +给定一个整数n,返回n皇后的摆法有多少种. +n=1 返回1 +n=2或3,2皇后和3皇后无论怎么摆都不行,返回0 +n=8,返回92 \ No newline at end of file diff --git a/算法/learn/体系/25.窗口内最大值或最小值的更新结构.md b/算法/learn/体系/25.窗口内最大值或最小值的更新结构.md new file mode 100644 index 0000000..0df017c --- /dev/null +++ b/算法/learn/体系/25.窗口内最大值或最小值的更新结构.md @@ -0,0 +1,31 @@ +逻辑能力 + +题目一 +假设一个固定大小为W的窗口,一次划过arr, +返回每一次滑出状况的最大值 +例如,arr=[4,3,5,4,3,3,6,7],W=3 +返回:[5,5,5,4,6,7] + +题目二 +给定一个整型数组arr,和一个整数num +某个arr中的子数组sub,如果想达标,必须满足: +sub中最大值-sub中最小值<=num +返回arr中达标子数组的数量. + +题目三 +汽车从那几个位置逆时针走能加满油 +gas [1,1,3,1] +cost [2,2,1,1] +自己整理个数组,最终和为0表示能跑完 [-1,-1,2,0] +累加和,计算最终结果大于0 [-1,-2,0,0,-1,-3,-3,-3] + +题目四 +arr是货币数组,其中的值都是正数,在给定一个正数aim +每个值都认为是一张货币 +返回组成aim的最少货币数 +注意: +因为是求最少货币数,所以每一张货币认为是相同或者不同都不重要了. + + +枚举行为用邻近位置代替. + \ No newline at end of file diff --git a/算法/learn/体系/26.单调栈结构.md b/算法/learn/体系/26.单调栈结构.md new file mode 100644 index 0000000..fed7496 --- /dev/null +++ b/算法/learn/体系/26.单调栈结构.md @@ -0,0 +1,12 @@ +一个数组,输出每个位置,左侧第一个比他小的位置,右侧第一个比他小的数. +放入从小到大的栈中,相同放到一个数据放入栈中,每次弹出是结算. + +题目一 给定一个只包含正数的数组arr,arr中任何一个子数组sub,一定都可以算出(sub累加和)*(sub中的最小值)是什么, +那么所有子数组中,这个值最大是多少. + +以每一个位置做最小值,计算数据 + +第一行为底,转直方图,转单调栈.第二行为底第一行为顶计算 + +题目五 +给定以个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量. \ No newline at end of file diff --git a/算法/learn/体系/27.单调栈(续)、由斐波那契数列讲述矩阵快速幂技巧.md b/算法/learn/体系/27.单调栈(续)、由斐波那契数列讲述矩阵快速幂技巧.md new file mode 100644 index 0000000..e475f4b --- /dev/null +++ b/算法/learn/体系/27.单调栈(续)、由斐波那契数列讲述矩阵快速幂技巧.md @@ -0,0 +1,36 @@ +求裴波那契数列矩阵乘法的方法 +1)裴波那契数列的线性求解(O(N))的方式求解非常好理解 +2)利用线性代数,也可以改写另一种表示 +|F(N),F(N-1)|=|F(2),F(1)|*某个二阶矩阵的N-2次方 +3)求出这个二阶矩阵,进而最快求出这个二阶矩阵的N-2次方. + + +题目四 +第一年农场有1只成熟的母牛A,往后的每年: +1)每一只成熟的母牛都会生一只母牛 +2)每一只新出生的母牛都在出生的第三年成熟 +3)每一只母牛永远不会死 +返回n年后的数量.F(n)=F(n-1)+F(n-3) + |a b c| +|4 3 2|=|3 2 1|* |d e f| + |g h i| + +3a+2d+1g = 4 +3b+2e+1h = 3 +3c+2f+1i = 2 + + + |a b c| +|6 4 3|=|4 3 2|* |d e f| + |g h i| + +4a+3d+2g = 6 +4b+3e+2h = 4 +4c+3f+2i = 3 + + +n-3 + +题目五 +给定一个数N,想象 +F(n)=F(n-1)+f(n-2) \ No newline at end of file diff --git a/算法/learn/体系/28.KMP算法.md b/算法/learn/体系/28.KMP算法.md new file mode 100644 index 0000000..22485aa --- /dev/null +++ b/算法/learn/体系/28.KMP算法.md @@ -0,0 +1,4 @@ +KMP算法(全称Knuth-Morris-Pratt字符串查找算法,由三位发明者的姓氏命名)是可以在文本串s中快速查找模式串p的一种算法。 + +求解next数组匹配加速. +next数组比对往右跳. \ No newline at end of file diff --git a/算法/learn/体系/29.Manacher算法.md b/算法/learn/体系/29.Manacher算法.md new file mode 100644 index 0000000..35ac131 --- /dev/null +++ b/算法/learn/体系/29.Manacher算法.md @@ -0,0 +1,11 @@ +求回文子串(连续) + +121aaaa2323aa +1. 数字两边插入数值 #1#2#1#a#a#a#a#2#3#2#3#a#a# +回文半径/直径,回文半径数组,最右回文边界,取的最右回文边界的中心 + + +1. 如果i在R外,暴力扩 +2. 如果i在R内,i`在L R内 O(1) + i`在L R外 O(1) + i`在L压线 diff --git a/算法/learn/体系/3.异或运算相关面试题.md b/算法/learn/体系/3.异或运算相关面试题.md new file mode 100644 index 0000000..34b1f28 --- /dev/null +++ b/算法/learn/体系/3.异或运算相关面试题.md @@ -0,0 +1,3 @@ +## 异或运算 +无进位相加,满足结合律和交换率 + \ No newline at end of file diff --git a/算法/learn/体系/30.bfprt算法、蓄水池算法.md b/算法/learn/体系/30.bfprt算法、蓄水池算法.md new file mode 100644 index 0000000..e043c0d --- /dev/null +++ b/算法/learn/体系/30.bfprt算法、蓄水池算法.md @@ -0,0 +1,17 @@ +在无序数组中求第K小的数 +1. 改写快排的方法 +2. bfprt算法 + + +1)随机选p +2)分区p +3)命中返回,未命中,选左边或者右边. + +题目 +给定一个无序数组arr中,给定一个正数k,返回top k个最大的数不同时间复杂度三个方法: +1) o(N*logN) +2) o(N+K*logN) +3) o(N+K*logK) + +蓄水池算法 +等概率进袋子. \ No newline at end of file diff --git a/算法/learn/体系/31.Morris遍历.md b/算法/learn/体系/31.Morris遍历.md new file mode 100644 index 0000000..b4d086f --- /dev/null +++ b/算法/learn/体系/31.Morris遍历.md @@ -0,0 +1,11 @@ +Morris遍历细节 +假设来到当前节点cur,开始时cur来到头结点的位置 +1) 如果cur没有左孩子,cur向右移动(cur=cur.right) +2) 如果cur有左孩子,找到左子树上最右的节点mostRight: + a. 如果mostRight的右指针指向空,让其指向cur,然后cur向左移动(cur=cur.left) + b. 如果mostRight的右指针指向cur,让其指向null,然后cur向右移动(cur = cur.right) +3) cur为空时停止遍历 + + + +需要左右树信息强整合则必须二叉树递归套路,否则,可以用Morris遍历. \ No newline at end of file diff --git a/算法/learn/体系/32.线段.md b/算法/learn/体系/32.线段.md new file mode 100644 index 0000000..b437fb0 --- /dev/null +++ b/算法/learn/体系/32.线段.md @@ -0,0 +1,8 @@ +i +父i/2 +左2*i +右2*i+1 + +懒更新 + +俄罗斯方块 diff --git a/算法/learn/体系/33.IndexTree、AC自动机.md b/算法/learn/体系/33.IndexTree、AC自动机.md new file mode 100644 index 0000000..4902fda --- /dev/null +++ b/算法/learn/体系/33.IndexTree、AC自动机.md @@ -0,0 +1,15 @@ +通过数据范围猜算法. +IndexTree +特点 +1) 支持区间查询 +2) 没有线段树那么强,但是非常容易改成一维,二维,三维的结构 +3) 只支持单点更新 +下标从1开始, +下标托管,二进制,最后一位1变为0并加1,管理到自身. + +AC自动机 +前缀数 +1) 头节点fail指针指空 +2) 头结点的子节点指头 +3) 某一个节点x,父节点通过&指向自己,父节点的file指针指向甲,甲有直接指向x的指针,则直接指过去,否则看甲的file指针, +如果一直没有找到则指向头节点 \ No newline at end of file diff --git a/算法/learn/体系/34.与哈希函数有关的结构.md b/算法/learn/体系/34.与哈希函数有关的结构.md new file mode 100644 index 0000000..b6842eb --- /dev/null +++ b/算法/learn/体系/34.与哈希函数有关的结构.md @@ -0,0 +1,3 @@ +一致性hash +虚拟节点 + \ No newline at end of file diff --git a/算法/learn/体系/35.资源限制类题目的解题套路.md b/算法/learn/体系/35.资源限制类题目的解题套路.md new file mode 100644 index 0000000..2764d59 --- /dev/null +++ b/算法/learn/体系/35.资源限制类题目的解题套路.md @@ -0,0 +1,14 @@ + 1) 布隆过滤器用于集合的建立与查询,并可以节省大量空间 + 2) 一致性哈希解决数据服务器负载管理问题 + 3) 利用并查集结构做岛问题的并行计算 + 4) 哈希函数可以把数据按照种类均匀分流(相同的数据一定在一块) + 5) 位图解决某一范围上数字的出现情况,并可以节省大量空间 + 6) 利用分段统计思想,并进一步节省大量空间 + 7) 利用堆,外排序来做多个处理单元的结果合并 + +## 4 +100G的数字文件取出出现次数最多的前100个数字. + +将100G利用Hash分为100个文件,将每个文件里的数据统计(相同的数据必定进入同一个文件), +取出每个文件的第一个数据,统计拿出第一个,这个就是想要的第一个数字,第一数字从那个文件中拿出, +去原来文件拿第二个统计,取出第一个,一簇循环取出100个 \ No newline at end of file diff --git a/算法/learn/体系/36.有序表(上).md b/算法/learn/体系/36.有序表(上).md new file mode 100644 index 0000000..8edbbd0 --- /dev/null +++ b/算法/learn/体系/36.有序表(上).md @@ -0,0 +1,3 @@ +数据库索引,有序表. +AVL树:左树高度和右树高度差小于2 +默认无相同的值 \ No newline at end of file diff --git a/算法/learn/体系/37.有序表(中).md b/算法/learn/体系/37.有序表(中).md new file mode 100644 index 0000000..26f9c5e --- /dev/null +++ b/算法/learn/体系/37.有序表(中).md @@ -0,0 +1,5 @@ +## size-balance +TreeMap +TreeSet +## 跳表 + diff --git a/算法/learn/体系/38.有序表(下).md b/算法/learn/体系/38.有序表(下).md new file mode 100644 index 0000000..162dfd0 --- /dev/null +++ b/算法/learn/体系/38.有序表(下).md @@ -0,0 +1,3 @@ +题目一 +给定一个数组arr,和两个整数a和b(a<=b),求arr中有多少个子数组,累加和在[a,b]这个范围上,返回达标 +的子数组数量. \ No newline at end of file diff --git a/算法/learn/体系/39.根据对数器找规律、根据数据量猜解法.md b/算法/learn/体系/39.根据对数器找规律、根据数据量猜解法.md new file mode 100644 index 0000000..8e0f394 --- /dev/null +++ b/算法/learn/体系/39.根据对数器找规律、根据数据量猜解法.md @@ -0,0 +1,8 @@ +https://shimo.im/docs/68cd6h3TwygPwx8W/read +1) 某个面试题如果输入简单,并且只有一个实际参数 +2) 要求的返回值类型也简单,并且只有一个 +3) 用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code +## 根据数据规模猜解法 +1) C/C++,一秒处理的指令数为10的8次方 +2) Java等语言,1~4秒处理的指令条数为10的8次方 +3) 这就是有大量的空间了. diff --git a/算法/learn/体系/4.一些基础的数据结构.md b/算法/learn/体系/4.一些基础的数据结构.md new file mode 100644 index 0000000..0d8e400 --- /dev/null +++ b/算法/learn/体系/4.一些基础的数据结构.md @@ -0,0 +1,54 @@ +1. 单链表、双向链表 +2. 栈队列 +## 数组做队列 +1. 数组固定长度,两个指针追赶。只用一个元素时不好实现。 +2. 添加变量队列元素个数。begin和end解耦。 +## 栈随时获取最小值 +1. 数据栈 +2. 最小栈(弹出后依然能获取最小值) +3. 压栈,数据栈正常压入,最小栈如果压入数小于栈顶则亚如当前数,如果大于则重复压入栈顶。 +4. 弹出同步弹出。 + +## 图优先遍历 +深度优先遍历:栈 +宽度优先遍历:队列 +## 栈实现队列 +1. 设置push栈和pop栈,两个来回倒,push压入,弹出时push中的数据放入pop中,从pop中弹出。(一次性倒完,) +## 队列实现栈 +1. 压栈放入一个队列中,需要弹栈的时候将全部放入另一个队列中,留下最后一个弹出。 +2. 再次放入,再放在当前队列中存入,弹出的时候,再次导入另一个队列中,最后一个弹出。 +## 递归 +### 递归改非递归 +使用系统栈。树遍历。 +递归到动态规划。 +大化小,递归图。 +## Master公式分析递归时间复杂度 +子问题规模一致 +## 哈希表 HashMap +## 有序表 TreeMap +## 归并排序 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/算法/learn/体系/40.根据数据量猜解法(续)、卡特兰数.md b/算法/learn/体系/40.根据数据量猜解法(续)、卡特兰数.md new file mode 100644 index 0000000..626c827 --- /dev/null +++ b/算法/learn/体系/40.根据数据量猜解法(续)、卡特兰数.md @@ -0,0 +1 @@ +A可以完全映射到B,B可以完全映射到A,一一映射 ,则AB相同 \ No newline at end of file diff --git a/算法/learn/体系/41.子数组达到规定累加和的最大长度系列问题.md b/算法/learn/体系/41.子数组达到规定累加和的最大长度系列问题.md new file mode 100644 index 0000000..990467e --- /dev/null +++ b/算法/learn/体系/41.子数组达到规定累加和的最大长度系列问题.md @@ -0,0 +1,28 @@ +窗口问题一般都存在单调性. + +利用单调性优化 +利用预处理结构优化+讨论来头或结尾. +假设答案法+淘汰可能性. + +题目四 +给定一个数组arr,给定一个值v,求子数组平均值小于等于v的最长子数组长度. +原数组每个值减去10,累加和中小于等于0的最长子数组长度. + + +题目五 +给定一个正方形矩阵matrix,原地调整(绕中心位置转动)成顺时针90度转动的样子 +a b c g d a +d e f h e b +g h i i f c + +从外往里,一圈一圈执行. + +圈结构 + +https://www.amysecure.com/clientarea.php + +byware.io +clash + + + diff --git a/算法/learn/体系/42.四边形不等式技巧(上).md b/算法/learn/体系/42.四边形不等式技巧(上).md new file mode 100644 index 0000000..c13f023 --- /dev/null +++ b/算法/learn/体系/42.四边形不等式技巧(上).md @@ -0,0 +1,8 @@ +四边形不等式技巧特征 +1. 两个可变参数的区间划分问题 +2. 每个格子有枚举行为 +3. 当两个可变参数固定一个,另一个参数和答案之间存在单调性关系 +4. 而且往往是反向单调关系 +5. 枚举加速的位置对:上➕右,或者,左➕下 +6. 不要证明!用对数器验证! +7. 可以把时间复杂度降低一阶 \ No newline at end of file diff --git a/算法/learn/体系/43.四边形不等式技巧(下).md b/算法/learn/体系/43.四边形不等式技巧(下).md new file mode 100644 index 0000000..b7c785e --- /dev/null +++ b/算法/learn/体系/43.四边形不等式技巧(下).md @@ -0,0 +1,17 @@ +## 邮局问题: +## 扔棋子问题 +不能用二分,必须完成任务. +f(n,k) +n还剩多少层楼要测试,k还剩多少棋子. + +# 四边形不等式技巧特征 +1. 两个可变参数的区间划分问题 +2. 每个格子有枚举行为 +3. 当两个可变参数固定一个,另一个参数和答案之间存在单调性关系(两个参数和结果关系) +4. 而且往往是反向单调关系 +5. 能否获得枚举指导的位置对:上➕右,或者左➕下 +# 四边形不等式技巧注意点 +1. 不要证明用对数器验证 +2. 枚举的时候面对最优答案相等的时候怎么处理?都试试 +3. 可以把时间复杂度降低一阶 +4. 四边形不等式有些时候是最优解,有些时候不是,不是的原因:尝试思路,在根儿上不够好 \ No newline at end of file diff --git a/算法/learn/体系/44.状态压缩的动态规划.md b/算法/learn/体系/44.状态压缩的动态规划.md new file mode 100644 index 0000000..e210d7c --- /dev/null +++ b/算法/learn/体系/44.状态压缩的动态规划.md @@ -0,0 +1,2 @@ +## 题目三 +你有无限的1*2的砖块,要铺满M*N的区域,不同的铺法有多少种 \ No newline at end of file diff --git a/算法/learn/体系/45.DC3生成后缀数组详解.md b/算法/learn/体系/45.DC3生成后缀数组详解.md new file mode 100644 index 0000000..fe3f11e --- /dev/null +++ b/算法/learn/体系/45.DC3生成后缀数组详解.md @@ -0,0 +1 @@ +分三类,S12类排序, \ No newline at end of file diff --git a/算法/learn/体系/46.后缀数组解决的面试题.md b/算法/learn/体系/46.后缀数组解决的面试题.md new file mode 100644 index 0000000..362f236 --- /dev/null +++ b/算法/learn/体系/46.后缀数组解决的面试题.md @@ -0,0 +1,3 @@ +## 题目一 +给定两个字符串str1和str2,想把str2整体插入到str1的某个位置,形成最大的字典序,返回字典序最大的结果. + diff --git a/算法/learn/体系/47.动态规划猜法中和外部信息简化的相关问题(上).md b/算法/learn/体系/47.动态规划猜法中和外部信息简化的相关问题(上).md new file mode 100644 index 0000000..e69de29 diff --git a/算法/learn/体系/48.动态规划猜法中和外部信息简化的相关问题(下).md b/算法/learn/体系/48.动态规划猜法中和外部信息简化的相关问题(下).md new file mode 100644 index 0000000..e69de29 diff --git a/算法/learn/体系/5.归并排序及相关面试题.md b/算法/learn/体系/5.归并排序及相关面试题.md new file mode 100644 index 0000000..c190ee4 --- /dev/null +++ b/算法/learn/体系/5.归并排序及相关面试题.md @@ -0,0 +1,6 @@ +## 递归排序 +1. 归并分两边排序 +2. 合并,左右比较放入一个新的数据做那个 +## 归并 +1. 步长从1开始增加到数组长度。 +2. merge sort 把需要比较的数据变成有序的信息。 \ No newline at end of file diff --git a/算法/learn/体系/6.归并排序附加题、随机快速排序.md b/算法/learn/体系/6.归并排序附加题、随机快速排序.md new file mode 100644 index 0000000..e435768 --- /dev/null +++ b/算法/learn/体系/6.归并排序附加题、随机快速排序.md @@ -0,0 +1 @@ +52:28 \ No newline at end of file diff --git a/算法/learn/体系/8.加强堆.md b/算法/learn/体系/8.加强堆.md new file mode 100644 index 0000000..9441f7f --- /dev/null +++ b/算法/learn/体系/8.加强堆.md @@ -0,0 +1,2 @@ +重复线段问题. +1. 取.5判断多少线段包含. \ No newline at end of file diff --git a/算法/learn/体系/9.前缀树、不基于比较的排序、排序稳定性.md b/算法/learn/体系/9.前缀树、不基于比较的排序、排序稳定性.md new file mode 100644 index 0000000..602466b --- /dev/null +++ b/算法/learn/体系/9.前缀树、不基于比较的排序、排序稳定性.md @@ -0,0 +1,3 @@ + 前缀数:记录字符串出现频率.pass,end + 桶排序 + 基数排序,按照个十百钱位 排序 \ No newline at end of file diff --git a/算法/learn/体系/img/19-3.png b/算法/learn/体系/img/19-3.png new file mode 100644 index 0000000..1e90dd4 Binary files /dev/null and b/算法/learn/体系/img/19-3.png differ diff --git a/算法/learn/体系/img/43.扔棋子第0-1层.png b/算法/learn/体系/img/43.扔棋子第0-1层.png new file mode 100644 index 0000000..62f5d8e Binary files /dev/null and b/算法/learn/体系/img/43.扔棋子第0-1层.png differ diff --git a/算法/learn/体系/img/43.扔棋子第0层.png b/算法/learn/体系/img/43.扔棋子第0层.png new file mode 100644 index 0000000..10ca803 Binary files /dev/null and b/算法/learn/体系/img/43.扔棋子第0层.png differ diff --git a/算法/learn/体系/img/43.扔棋子第i层.png b/算法/learn/体系/img/43.扔棋子第i层.png new file mode 100644 index 0000000..0ca76d1 Binary files /dev/null and b/算法/learn/体系/img/43.扔棋子第i层.png differ diff --git a/算法/learn/体系/img/43.扔棋子转四边形不等式.png b/算法/learn/体系/img/43.扔棋子转四边形不等式.png new file mode 100644 index 0000000..13757ec Binary files /dev/null and b/算法/learn/体系/img/43.扔棋子转四边形不等式.png differ diff --git a/算法/learn/体系/img/45.DC3后缀树.png b/算法/learn/体系/img/45.DC3后缀树.png new file mode 100644 index 0000000..44237ee Binary files /dev/null and b/算法/learn/体系/img/45.DC3后缀树.png differ diff --git a/算法/learn/体系/img/45.DC3后缀树1.png b/算法/learn/体系/img/45.DC3后缀树1.png new file mode 100644 index 0000000..a829926 Binary files /dev/null and b/算法/learn/体系/img/45.DC3后缀树1.png differ diff --git a/算法/learn/体系/img/45.DC3后缀树2.png b/算法/learn/体系/img/45.DC3后缀树2.png new file mode 100644 index 0000000..1e5a8e4 Binary files /dev/null and b/算法/learn/体系/img/45.DC3后缀树2.png differ diff --git a/算法/learn/体系/img/45.DC3后缀树分三份.png b/算法/learn/体系/img/45.DC3后缀树分三份.png new file mode 100644 index 0000000..60e6ab2 Binary files /dev/null and b/算法/learn/体系/img/45.DC3后缀树分三份.png differ diff --git a/算法/learn/体系/img/46.后缀数组使用.png b/算法/learn/体系/img/46.后缀数组使用.png new file mode 100644 index 0000000..847288d Binary files /dev/null and b/算法/learn/体系/img/46.后缀数组使用.png differ diff --git a/算法/learn/体系/img/mincoinsnolimit.png b/算法/learn/体系/img/mincoinsnolimit.png new file mode 100644 index 0000000..548c86b Binary files /dev/null and b/算法/learn/体系/img/mincoinsnolimit.png differ diff --git a/算法/learn/体系/img/twentythird/killmonster.png b/算法/learn/体系/img/twentythird/killmonster.png new file mode 100644 index 0000000..5470d8a Binary files /dev/null and b/算法/learn/体系/img/twentythird/killmonster.png differ diff --git a/算法/learn/体系/img/twentythird/mincoinsnolimit.png b/算法/learn/体系/img/twentythird/mincoinsnolimit.png new file mode 100644 index 0000000..548c86b Binary files /dev/null and b/算法/learn/体系/img/twentythird/mincoinsnolimit.png differ diff --git a/算法/learn/体系/img/二叉树排序.png b/算法/learn/体系/img/二叉树排序.png new file mode 100644 index 0000000..95ef543 Binary files /dev/null and b/算法/learn/体系/img/二叉树排序.png differ diff --git a/算法/learn/体系/img/二叉树递归.png b/算法/learn/体系/img/二叉树递归.png new file mode 100644 index 0000000..8f86eb8 Binary files /dev/null and b/算法/learn/体系/img/二叉树递归.png differ diff --git a/算法/learn/体系/img/人员能力.png b/算法/learn/体系/img/人员能力.png new file mode 100644 index 0000000..5625f47 Binary files /dev/null and b/算法/learn/体系/img/人员能力.png differ diff --git a/算法/learn/体系/img/代理.png b/算法/learn/体系/img/代理.png new file mode 100644 index 0000000..c6a57ca Binary files /dev/null and b/算法/learn/体系/img/代理.png differ diff --git a/算法/learn/体系/img/创建多个hash函数.png b/算法/learn/体系/img/创建多个hash函数.png new file mode 100644 index 0000000..aec3fea Binary files /dev/null and b/算法/learn/体系/img/创建多个hash函数.png differ diff --git a/算法/learn/体系/img/卡特兰数.png b/算法/learn/体系/img/卡特兰数.png new file mode 100644 index 0000000..d53d727 Binary files /dev/null and b/算法/learn/体系/img/卡特兰数.png differ diff --git a/算法/learn/体系/img/布隆过滤器计算.png b/算法/learn/体系/img/布隆过滤器计算.png new file mode 100644 index 0000000..3be23ea Binary files /dev/null and b/算法/learn/体系/img/布隆过滤器计算.png differ diff --git a/算法/learn/体系/img/常数时间.png b/算法/learn/体系/img/常数时间.png new file mode 100644 index 0000000..1d9c694 Binary files /dev/null and b/算法/learn/体系/img/常数时间.png differ diff --git a/算法/learn/体系/img/归并merge.png b/算法/learn/体系/img/归并merge.png new file mode 100644 index 0000000..8be85ef Binary files /dev/null and b/算法/learn/体系/img/归并merge.png differ diff --git a/算法/learn/体系/img/手写/2.认识复杂度.jpg b/算法/learn/体系/img/手写/2.认识复杂度.jpg new file mode 100644 index 0000000..ad06d8d Binary files /dev/null and b/算法/learn/体系/img/手写/2.认识复杂度.jpg differ diff --git a/算法/learn/体系/img/排序算法总结.png b/算法/learn/体系/img/排序算法总结.png new file mode 100644 index 0000000..778bfe0 Binary files /dev/null and b/算法/learn/体系/img/排序算法总结.png differ diff --git a/算法/learn/体系/img/斐波那契数列.png b/算法/learn/体系/img/斐波那契数列.png new file mode 100644 index 0000000..5e99af3 Binary files /dev/null and b/算法/learn/体系/img/斐波那契数列.png differ diff --git a/算法/learn/体系/img/斐波那契数列2.png b/算法/learn/体系/img/斐波那契数列2.png new file mode 100644 index 0000000..943ce5b Binary files /dev/null and b/算法/learn/体系/img/斐波那契数列2.png differ diff --git a/算法/learn/体系/img/算法复杂度.png b/算法/learn/体系/img/算法复杂度.png new file mode 100644 index 0000000..a6f7980 Binary files /dev/null and b/算法/learn/体系/img/算法复杂度.png differ diff --git a/算法/learn/体系/堆和堆排序.md b/算法/learn/体系/堆和堆排序.md new file mode 100644 index 0000000..34c1ae6 --- /dev/null +++ b/算法/learn/体系/堆和堆排序.md @@ -0,0 +1,10 @@ +比较器返回为负数,第一个在前. +左节点2*i+1 +右节点2*i+2 +父节点(i-1)/2 +## 堆 +完全二叉树. + +PriorityQueue默认小根堆 + + \ No newline at end of file diff --git a/算法/learn/体系/快排.md b/算法/learn/体系/快排.md new file mode 100644 index 0000000..5980ab3 --- /dev/null +++ b/算法/learn/体系/快排.md @@ -0,0 +1 @@ +指针指向及移动. \ No newline at end of file diff --git a/算法/learn/大厂刷题/Eighteen.md b/算法/learn/大厂刷题/Eighteen.md new file mode 100644 index 0000000..a28a2ab --- /dev/null +++ b/算法/learn/大厂刷题/Eighteen.md @@ -0,0 +1,21 @@ +## 题目一 +给定一个数组arr,长度为N,arr中值只有1,2,3三种 +arr[i]==1,代表汉诺塔问题中,从上往下第i个圆盘目前在左 +arr[i]==2,代表汉诺塔问题中,从上往下第i个圆盘目前在中 +arr[i]==3,代表汉诺塔问题中,从上往下第i个圆盘目前在右 +那么arr整体就代表汉诺塔游戏过程中的一个状态 +如果这个状态不是汉诺塔最优解运动过程中的状况,返回-1 +如果这个状况是汉诺塔最优解运动过程中的状况,返回他是第几个状况 + +## 题目二 +https://leetcode-cn.com/problems/shortest-bridge/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china +## 题目三 +https://www.nowcoder.com/questionTerminal/8ecfe02124674e908b2aae65aad4efdf +## 題目四 +https://www.nowcoder.com/practice/7201cacf73e7495aa5f88b223bbbf6d1 + + + + + + diff --git a/算法/learn/大厂刷题/Eleven.md b/算法/learn/大厂刷题/Eleven.md new file mode 100644 index 0000000..c6e0ab7 --- /dev/null +++ b/算法/learn/大厂刷题/Eleven.md @@ -0,0 +1,8 @@ +## 题目2 +一个字符串至少切几刀,切出所有的子字符串都是回文字符串. + +从左往右的尝试模型 + +返回其中一种切法 +剪枝 +连续头区间,连续尾区间. \ No newline at end of file diff --git a/算法/learn/大厂刷题/First.md b/算法/learn/大厂刷题/First.md new file mode 100644 index 0000000..404a548 --- /dev/null +++ b/算法/learn/大厂刷题/First.md @@ -0,0 +1,80 @@ +## 题目一 +给定一个有序数组arr,代表坐落在X轴上的点 +给定一个正数K,代表绳子的长度 +返回绳子最多压中几个点? +即使绳子边缘处盖住点也算盖住 + +滑动窗口. + +## 题目二 +给定一个文件目录的路径 +写一个函数统计这个目录下所有的文件数量并返回 +隐藏文件也算,但是文件夹不算. + +遍历树, + +## 题目三 +给定以个非负整数num, +如何不用循环语句, +返回>=num,并且离num最近的,2的某次方 + +``` + public int getTwo(int start){ + start--; + // 用1填满加1 + start|=(start>>>1); + start|=start|(start>>>2); + start|=start|(start>>>4); + start|=start|(start>>>8); + start|=start|(start>>>16); + return (start<0)?1:start+1; + } +``` + +## 题目四 +一个数组中只有两种字符'G'和'B' +可以让所有的G都放在左侧,所有的B都放在右侧 +或者可以让所有的G都放在右侧,所有的B都放在左侧 +但是只能在相邻字符之间进行交换操作, +返回至少需要交换几次 +``` + public int minTime(String abc){ + char[] chars = abc.toCharArray(); + int gIndex=0; + int gTimes=0; + int bIndex=0; + int bTimes=0; + for (int i=0;i=这份工作的难度,才能上班 +返回一个长度为M的数组ans,ans[j]表示j号人能获得的最好收入. + +有序表 TreeMap + +### 题目二 +贩卖机只支持硬币支付,且收退都支持10,50,100三种面额 +一次购买只能出一瓶可乐,且投钱和找零都遵循优先使用钱的原则 +需要购买可乐数量是m, +其中手头拥有的10,50,100的数量分别为a,b,c +可乐的价格是x(x是10的倍数) +请计算出需要投入硬币次数 + +### 题目三 +已知一个消息流会不断地吐出整数1~N, +单不一定按照顺序依次吐出 +如果上次打印的序号为i,那么当i+1出现时 +请打印i+1及其之后接收过的并且连续的所有数 +直到1~N全部接收并打印完 +请设计这种接收并打印的结构 + +等待那一个值到来 +头开头hash表 +尾开头hash表 + +判断以某个数开头拼接,以某个数结尾拼接 + +### 题目四 +现有司机N*2人,调度中心将所有司机平分给A,B两个区域 +第i个司机去A可得收入为income[i][0] +第i个司机去B可得收入为income[i][1] +返回所有调度方案中能使所有司机总收入最高的方案,是多少钱 +### 题目七 +给定一个数组arr,只能对arr中的一个子数组排序,但是想让arr整体都有序 +返回满足这个设定的子数组中,最短的是多长 + +从左往右找最大值,不合适画错,确定右边那些不需要移动 +从右网左找最小值,不合适画错,确定左边那些不需要移动. + +### 题目八 +HashMap添加setAll设置所有的value,复杂度仍o1 +时间戳计数 +setAllTime=3 +all=7 \ No newline at end of file diff --git a/算法/learn/大厂刷题/SevenTeen.md b/算法/learn/大厂刷题/SevenTeen.md new file mode 100644 index 0000000..30eccec --- /dev/null +++ b/算法/learn/大厂刷题/SevenTeen.md @@ -0,0 +1,53 @@ +## 题目一 +1,3,5,7 +2,4,6,13 +3,9,14,14 +右上,左下. +二分,并记录小于等于某个值的个数和最接近的数 +## 题目四 StingST +给定两个字符串S和T +返回S的所有子序列中 +有多少个子序列的字面值等于T +[1,1,2,2] [1,2] +样本对应模型 ,结尾位置是否使用 +S T +自序列 前缀串 +dp[i][j]:s只拿前i个字符串做子序列,有多少个子序列,字面值等于T的前j个字符的前缀串 + +## 题目五 +给定一个字符串Str +返回Str的所有子序列中有多少不同的字面值 +https://leetcode.com/problems/distinct-subsequences-ii/ +1,2,3,1 +第0个all为{""} 1 +第1个all为{"",1} +第2个all为当前值加上上一个all {"",1,2,12} +第3个all为当前值加上上一个all {"",1,2,12,3,13,23,123} +如果出现相同值当前值减去上次以相同符号开始的集合的非空总数 +{"",1,2,12,3,13,23,123, 1,11,21,121,31,131,231,1231}-{1} + + + + + +mynachure + + + + + + + + + + + + + + + + + + + + diff --git a/算法/learn/大厂刷题/Sixteen.md b/算法/learn/大厂刷题/Sixteen.md new file mode 100644 index 0000000..ba9dd89 --- /dev/null +++ b/算法/learn/大厂刷题/Sixteen.md @@ -0,0 +1,32 @@ +## 题目一 +给定一个有正,有负,有0的数组arr, +给定一个整数k, +返回arr的子集是否能累加出k +1) 正常怎么做;经典动态规划,行作为数类作为值判断是否包含某个数,由于含有负数,因此采用平移的方式-n=>0 0->n +2) 如果arr中的数值很大,但是arr的长度不大,怎么做;分治,经典动态规划太废表 +## 题目二 +给定一个整数数组arr, +返回arr的子集不能累加出的最小正数 +1) 正常怎么做 +2) 如果arr中肯定有1这个值,怎么做. + +## 题目五 +约瑟夫环问题 +给定一个链表头节点head,和一个正数m +从头开始,每次数到m就杀死当前节点 +然后被杀节点的下一个节点从1开始重新数, +周而复始知道只剩一个节点,返回最后的节点 +暴力O(n*m) + +## 题目六 +给定正数power,给定一个数组arr,给定一个数组reverse +含义如下: +arr长度一定是2的power次方 +reverse中的每个值一定都在0~power范围. +例如power=2,arr={3,1,4,2},reverse={0,1,0,2} +任何一个在前的数字可以和任何一个在后的数组,构成一对数 +可能是升序关系/相等关系或者降序关系 +比如arr开始时有如下的降序对:(3,1)(3,2)(4,2),一共3个 +接下来根据reverse对arr进行调整: +reverse[0]=0,表示在arr中,划分每1(2的0次方)个数一组然后每个 +小组内部逆序,那么arr变为[1,3,2,4],此时有3个逆序对 \ No newline at end of file diff --git a/算法/learn/大厂刷题/Ten.md b/算法/learn/大厂刷题/Ten.md new file mode 100644 index 0000000..136d063 --- /dev/null +++ b/算法/learn/大厂刷题/Ten.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/算法/learn/大厂刷题/Third.md b/算法/learn/大厂刷题/Third.md new file mode 100644 index 0000000..5e07e78 --- /dev/null +++ b/算法/learn/大厂刷题/Third.md @@ -0,0 +1,40 @@ +### 题目九 +给定三个参数: +二叉树的头节点head,树上某个节点target,正数k +从target开始,可以往上走或者向下走 +返回与target的距离是k的所有节点 + +### 题目四 +给定一个额数组arr,代表每个人的能力值.再给定一个非负数k +如果两个人能力差值正好为k,那么可以凑在一起比赛 +一局比赛只有两个人 +返回最多可以同时有多少场比赛 + +排序,滑动窗口 + +### 题目五 +给定一个而正整数组arr,代表若干人的体重 +在给定以个正数limit,表示所有船共同拥有的载重量 +每艘船最多坐两人,且不能超过载重 +想让所有的人同时过河,并且最好的分配方法让船尽量少返回 +返回最好船只数 + +从n/2开始分别网左右对比可同时过河的人. + +### 题目六 + +// todo findRotateSteps +### 题目二 +只由小写字母(a-z)组成的一批字符串 +都放在字符类型的数组String[] arr中 +如果其中某两个字符串锁含有的字符串种类完全一样 +就将两个字符串算作一类 +比如:baacbba和bac就算作一类 +返回arr中有多少类. + +### 题目三 +给定一个只有0和1组成的二维数组 +返回边框全是1的最大正方形面积 + + +子串从开始计算,以当前节点为最右节点处理. ,利用部分结果加速 \ No newline at end of file diff --git a/算法/learn/大厂刷题/Thirteen.md b/算法/learn/大厂刷题/Thirteen.md new file mode 100644 index 0000000..9e7cdbd --- /dev/null +++ b/算法/learn/大厂刷题/Thirteen.md @@ -0,0 +1,10 @@ +## 题目一 +面值为1-N的牌组成一组 +每次你从组里等概率的抽出1-n中的一张 +下次抽会换一组新的,有无限组 +当累加和=a且=b时,你将失败 +返回获胜的概率,给定的参数为N,a,b + + diff --git a/算法/learn/大厂刷题/Twenty.md b/算法/learn/大厂刷题/Twenty.md new file mode 100644 index 0000000..6d6619a --- /dev/null +++ b/算法/learn/大厂刷题/Twenty.md @@ -0,0 +1,15 @@ +## 题目一 +如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回 +已知二叉树中没有重复值 +先序:头,左,右 +中序:左,头,右 +后序:左,右,头 + +## 题目四 +给定一个字符串str,当然可以生成很多子序列 +返回有多少个子序列是回文子序列,空序列不算回文. +范围尝试模型 +[l,r] +(l,r) +[l,r) +(l,r] diff --git a/算法/learn/大厂刷题/eight.md b/算法/learn/大厂刷题/eight.md new file mode 100644 index 0000000..d0fff45 --- /dev/null +++ b/算法/learn/大厂刷题/eight.md @@ -0,0 +1,6 @@ +括号嵌套使用递归. + +桶问题只关心是否能推高答案. + + +可以走重复路,样本模型. \ No newline at end of file diff --git a/算法/learn/大厂刷题/forty/Nine.md b/算法/learn/大厂刷题/forty/Nine.md new file mode 100644 index 0000000..5aefdc7 --- /dev/null +++ b/算法/learn/大厂刷题/forty/Nine.md @@ -0,0 +1,10 @@ +## 527字符串简写 +第一个和最后一个不可省略.给一串字符串,尽量是字符串精简. +## 548 +## 564 +返回一个数上方和下放最近的回文数,不能是自身. +中间位加1或者中间位减一.偶数位可能要补充一位 + +粗回文,从左往右对称. +## 440 +数位dp, \ No newline at end of file diff --git a/算法/learn/大厂刷题/forty/img/527.png b/算法/learn/大厂刷题/forty/img/527.png new file mode 100644 index 0000000..fdfe560 Binary files /dev/null and b/算法/learn/大厂刷题/forty/img/527.png differ diff --git a/算法/learn/大厂刷题/img/Twenty-1.png b/算法/learn/大厂刷题/img/Twenty-1.png new file mode 100644 index 0000000..c8ddbfa Binary files /dev/null and b/算法/learn/大厂刷题/img/Twenty-1.png differ diff --git a/算法/learn/大厂刷题/img/first/动态规划转移.png b/算法/learn/大厂刷题/img/first/动态规划转移.png new file mode 100644 index 0000000..e341dda Binary files /dev/null and b/算法/learn/大厂刷题/img/first/动态规划转移.png differ diff --git a/算法/learn/大厂刷题/need.md b/算法/learn/大厂刷题/need.md new file mode 100644 index 0000000..ea1f343 --- /dev/null +++ b/算法/learn/大厂刷题/need.md @@ -0,0 +1 @@ +four \ No newline at end of file diff --git a/算法/learn/大厂刷题/nine.md b/算法/learn/大厂刷题/nine.md new file mode 100644 index 0000000..1d93c8e --- /dev/null +++ b/算法/learn/大厂刷题/nine.md @@ -0,0 +1,15 @@ +### 题目六 +定义何为step sum? +比如680,680+68+6=754,680的step sum 叫754 +给定一个正数num,判断他是不是某个数的step sum + +公式法:x+x/10+x/100=754 + +二分查找 +### 题目一 +给定一个数组,长度为N,arr中的值 + +下一个上一个当前 +从左到右的尝试模型, + +## 最长递增子序列 diff --git a/算法/learn/大厂刷题/seven.md b/算法/learn/大厂刷题/seven.md new file mode 100644 index 0000000..1ec58f0 --- /dev/null +++ b/算法/learn/大厂刷题/seven.md @@ -0,0 +1,33 @@ +### 题目一 +给定一个非负数组成的数组,长度一定大于1想知道数组中哪两个数&的结果最大返回这个结果 + +从高位开始看,&为1的结果,一个一个看看. + +### 题目二 + +相机最小覆盖问题 + +二叉树递归套路. + ### 题目三 +给定一个数组arr,返回如果排序之后,相邻两数的最大差值. +假设答案法.桶排序 + + + + + + + + + + + + + + + + + + + + diff --git a/算法/learn/大厂刷题/six.md b/算法/learn/大厂刷题/six.md new file mode 100644 index 0000000..fd448d4 --- /dev/null +++ b/算法/learn/大厂刷题/six.md @@ -0,0 +1,3 @@ +### 题目一 +数组中所有数都异或起来的结果,叫做异或和 +给定一个数组arr,返回arr的最大子数组异或和 diff --git a/算法/learn/大厂刷题/twenty/Tewenty-eight.md b/算法/learn/大厂刷题/twenty/Tewenty-eight.md new file mode 100644 index 0000000..d4ec16d --- /dev/null +++ b/算法/learn/大厂刷题/twenty/Tewenty-eight.md @@ -0,0 +1,4 @@ +数组做栈滑动指针 + + +子数组必须连续,以某个数结尾,往左可以得出答案. \ No newline at end of file diff --git a/算法/learn/大厂刷题/twenty/Twenty-five.md b/算法/learn/大厂刷题/twenty/Twenty-five.md new file mode 100644 index 0000000..c18c0c2 --- /dev/null +++ b/算法/learn/大厂刷题/twenty/Twenty-five.md @@ -0,0 +1,6 @@ +获取最右侧的1: num&(~num+1) +https://leetcode.com/problems/ip-to-cidr/ +https://leetcode.com/problems/3sum/ +双指针 + +求两个数的最大公约数 diff --git a/算法/learn/大厂刷题/twenty/Twenty-four.md b/算法/learn/大厂刷题/twenty/Twenty-four.md new file mode 100644 index 0000000..41e5618 --- /dev/null +++ b/算法/learn/大厂刷题/twenty/Twenty-four.md @@ -0,0 +1,49 @@ +## 题目二 +长度为N的数组arr,一定可以组成N^2个数字对 +例如arr=[3,1,2],数字对应有(3,1),(3,2),(1,2)(3,3),(2,2)(1,1),(1,3,)(2,3),(2,1) +也就是任意两个数都可以,而且自己和自己也算数字对 +数字对怎么排序 +第一维数据从小到大;第一维数据一样的,第二维数组也从小到大 +所以上面的数据裴谞结果为(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)(3,3) +给定一个数组arr,和整数k返回第k小的数值对 + + +取出第i小,不排序,体系30 bfrp算法. + +## 题目三 +正常的例程表会依次显示自然数表示里程 +吉祥的里程表会忽略含有4的数字而跳到下一个完全不含有4的数 +正常:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 +吉祥:1,2,3,5,6,7,8,9,10,11,12,13,15,16,17 +给定一个吉祥里程表的数字num(当然这个数字中不含有4) +返回这个数字代表的真实里程 +从0开始每位有几个数. + +## 题目一 +给定一个整数数组arr,长度一定大于6(>=7) +一定要选3个数组做分割点,从而分出4个部分,并且每部分都有数分割点的数字直接删除, +不属于任何4个部分中的任何一个. +如:{3,2,3,7,4,4,3,1,1,6,7,1,5,2,} +可以分成{3,2,3},{4,4},{1,1,6},{1,5,2}分割点是不算的. + +## 题目四 +N*M的棋盘(N和M是输入参数) +每种颜色的格子数必须相同的 +上下左右的各自算相邻 +相邻各自染的颜色必须不同 +所有各自必须染色 +返回至少多少种颜色可以完成任务. + +## 题目五 +给定两个字符串str1和str2 +在str1中寻找一个最短子串,能包含str2的所有字符 +字符顺序无所谓,str1这个最短子串也可以包含多余的字符 +返回这个最短包含子串 + +滑动窗口方法 + +## 题目六 +一个字符串删除删除重复的字符,每个字符留下一个,求删除最小字典序删除方式. + +选到最后不能都出现所有字符的位置. +记下最小, \ No newline at end of file diff --git a/算法/learn/大厂刷题/twenty/Twenty-one.md b/算法/learn/大厂刷题/twenty/Twenty-one.md new file mode 100644 index 0000000..d4b7386 --- /dev/null +++ b/算法/learn/大厂刷题/twenty/Twenty-one.md @@ -0,0 +1,39 @@ +## 树链 +LinkCutTree + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/算法/learn/大厂刷题/twenty/Twenty-seven.md b/算法/learn/大厂刷题/twenty/Twenty-seven.md new file mode 100644 index 0000000..5f4e58e --- /dev/null +++ b/算法/learn/大厂刷题/twenty/Twenty-seven.md @@ -0,0 +1,5 @@ +## 题目一 +每一个项目都有三个数,[a,b,c]表示项目a和b乐队参演,花费为c,给定很多个项目int[][] programs +每一个乐队可能在多个项目里都出现了,但是只能挑一次nums是可以挑选的项目数量,所以一定会有nums*2只乐队被挑选出来 +返回一共挑nums轮(也就意味着一定请到所有的乐队),最小花费是多少? +nums<9,programs长度小于500,每组测试乐队的全 部数量一定是nums*2,且标号一定是0~nums*2-1 \ No newline at end of file diff --git a/算法/learn/大厂刷题/twenty/Twenty-six.md b/算法/learn/大厂刷题/twenty/Twenty-six.md new file mode 100644 index 0000000..63a4255 --- /dev/null +++ b/算法/learn/大厂刷题/twenty/Twenty-six.md @@ -0,0 +1,3 @@ +宽度优先遍历,距离表,方便深度优先遍历(方便查看路径)剪枝 + +并查集,合并. diff --git a/算法/learn/大厂刷题/twenty/Twenty-three.md b/算法/learn/大厂刷题/twenty/Twenty-three.md new file mode 100644 index 0000000..29d0ddd --- /dev/null +++ b/算法/learn/大厂刷题/twenty/Twenty-three.md @@ -0,0 +1,76 @@ +## 题目二 +给定一个数组arr,长度为N>1 +从中间切一刀,保证左部分和有部分都有数字,一共有N-1种切法 +如此多的切法中,每一种都有: +绝对值(左部分最大值-右部分最大值) +返回最大值的绝对值是多少 +方法一 +创建两个辅助数组,一个从左往右记录最大值,一个从右往左记录最大值 +两个数组一一对应相减 +方法二 +找出最大值-min(最左,最右) + +子数组连续的几个,子序列可不连续的. + +## 题目三 +定义什么事可整合数组 +一个数组排完序之后,除了最左侧的数外,有arr[i]=arr[i-1]+1 +则称这个数组为可整合数组 +比如{5,1,2,4,3};{6,2,3,1,5,4}都是可整合数组 +返回arr中最长可整合数组的长度. +1) 无重复 +2) max-min=n-1 + +## 题目四 +超级水王问题,某个数组中某个数字个数超过一半. +一次删掉两个不同的数,如果有水王则剩下的一定是水王. +遍历剩下的数,看个数是否超过一半. +定义两个数:候选,血量.(同时删除两个) + +扩展1.摩尔投票 +某个数大于N/k次打印,候选k-1 +扩展2.给定一个正数k,返回所有出现次数>N/k的数 + + +arr[l..r]一定要整出k份,合并的最小代价, 返回. + +## 题目五 +https://leetcode.cn/problems/minimum-cost-to-merge-stones/ +总是多想,立足当下. +## 题目一 +给定数组father大小为N,表示一共有N个节点 +father[i]=j表示点i的父亲是点j,father表示的树一定是一棵树而不是森林 +queries是二维数组,大小为M*2,每一个长度为2的数组都表示一个查询[4,9], +表示想查询4和9之间的最低公共祖先 +[3,7]表示想查询3和7之间的最低公共祖先... +tree和queries里面的所有值,都一定在0到n-1之间 +返回一个数组ans,大小为m,ans[i]表示第i条查询的答案. + + +树链抛分,21节 + +难得东西在,年轻的时候学些 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/算法/learn/大厂刷题/twenty/Twenty-two.md b/算法/learn/大厂刷题/twenty/Twenty-two.md new file mode 100644 index 0000000..d4b7386 --- /dev/null +++ b/算法/learn/大厂刷题/twenty/Twenty-two.md @@ -0,0 +1,39 @@ +## 树链 +LinkCutTree + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/算法/learn/大厂刷题/twenty/img/23树链抛分.png b/算法/learn/大厂刷题/twenty/img/23树链抛分.png new file mode 100644 index 0000000..f900767 Binary files /dev/null and b/算法/learn/大厂刷题/twenty/img/23树链抛分.png differ diff --git a/算法/每周有营养的大厂算法面试题/邻接表表示无向图.png b/算法/每周有营养的大厂算法面试题/邻接表表示无向图.png new file mode 100644 index 0000000..515e4eb Binary files /dev/null and b/算法/每周有营养的大厂算法面试题/邻接表表示无向图.png differ diff --git a/算法/算法和数据结构体系学习班/17图/img/邻接矩阵法.png b/算法/算法和数据结构体系学习班/17图/img/邻接矩阵法.png new file mode 100644 index 0000000..43f7326 Binary files /dev/null and b/算法/算法和数据结构体系学习班/17图/img/邻接矩阵法.png differ diff --git a/算法/算法和数据结构体系学习班/17图/img/邻接表法.png b/算法/算法和数据结构体系学习班/17图/img/邻接表法.png new file mode 100644 index 0000000..0c617e1 Binary files /dev/null and b/算法/算法和数据结构体系学习班/17图/img/邻接表法.png differ diff --git a/算法/算法和数据结构体系学习班/17图/图.md b/算法/算法和数据结构体系学习班/17图/图.md new file mode 100644 index 0000000..6284672 --- /dev/null +++ b/算法/算法和数据结构体系学习班/17图/图.md @@ -0,0 +1,26 @@ +有向图 + +邻接表法、邻接矩阵法描述图 + +![](img\邻接表法.png) + +![](img\邻接矩阵法.png) + +图(Graph)包含点(Node)和边(Edge)。 + +### 宽度优先遍历 + +按照分支一个一个走,栈弹出一个打印一次,Set登记表记录哪些走过。 + +### 深度优先遍历 + +深度优先遍历,入栈打印 + +拓扑序,点数大的小。 + + + + + + + diff --git a/算法/算法和数据结构体系学习班/18、认识一些经典的递归过程/一些经典的递归过程.md b/算法/算法和数据结构体系学习班/18、认识一些经典的递归过程/一些经典的递归过程.md new file mode 100644 index 0000000..e69de29 diff --git a/算法/算法和数据结构体系学习班/2.认识复杂度、对数器、二分法.md b/算法/算法和数据结构体系学习班/2.认识复杂度、对数器、二分法.md new file mode 100644 index 0000000..fee7a6b --- /dev/null +++ b/算法/算法和数据结构体系学习班/2.认识复杂度、对数器、二分法.md @@ -0,0 +1,44 @@ +# 认识复杂度、对数器、二分法或异运算 +1. 时间复杂度 +2. 额外空间复杂度 +3. 常数项,一个操作的执行时间不以具体样本量为转移(数组寻址),每次执行时间都是固定的时间。 +### 时间复杂度 +#### 选择排序 +1. n*(看+比)+1 +2. (n-1)* n*(看+比)+1 +3. (n-2)* n*(看+比)+1 +4. 2*(n+n-1+n-2+····+1)+n 看+比 2 +5. 2an平方+bn+n+c +6. 2an平方 +最高阶,选出最小的,从头开始放。 +#### 冒泡排序 +1. 相邻的两个比较,大的放后面,最大值在后面。 +2. n-1 +3. n-2 +4. n-3 +5. 1 +5. n平方 +#### 插入排序 +1. 最好n +2. 最差n平方 +#### 计算时间复杂度 +1. 按照最坏的情况来 +2. 拆分为一个个基本动作 +3. 如果数据量为n,看基本动作和n之间的关系。 +4. 只把高阶项留下,低阶项和常数项去除。 +### 常数项 +### 最优解 +1. 时间复杂度 +2. 空间复杂度 +#### 常数时间操作 +1. 常见算数操作 +2. 移位、位运算 +3. 复制、比较、自增、自减操作 +4. 数组寻址操作 +#### 非常数时间操作 +1、链表LinkedList +### 对数器 +### 局部最小值 +数据状况和问题本身梳理问题。 +二分排他性 +俩边开始找,根据趋势,二分处理。 \ No newline at end of file diff --git a/算法/算法和数据结构体系学习班/3.异或运算相关面试题.md b/算法/算法和数据结构体系学习班/3.异或运算相关面试题.md new file mode 100644 index 0000000..34b1f28 --- /dev/null +++ b/算法/算法和数据结构体系学习班/3.异或运算相关面试题.md @@ -0,0 +1,3 @@ +## 异或运算 +无进位相加,满足结合律和交换率 + \ No newline at end of file diff --git a/算法/算法和数据结构体系学习班/4.一些基础的数据结构.md b/算法/算法和数据结构体系学习班/4.一些基础的数据结构.md new file mode 100644 index 0000000..0d8e400 --- /dev/null +++ b/算法/算法和数据结构体系学习班/4.一些基础的数据结构.md @@ -0,0 +1,54 @@ +1. 单链表、双向链表 +2. 栈队列 +## 数组做队列 +1. 数组固定长度,两个指针追赶。只用一个元素时不好实现。 +2. 添加变量队列元素个数。begin和end解耦。 +## 栈随时获取最小值 +1. 数据栈 +2. 最小栈(弹出后依然能获取最小值) +3. 压栈,数据栈正常压入,最小栈如果压入数小于栈顶则亚如当前数,如果大于则重复压入栈顶。 +4. 弹出同步弹出。 + +## 图优先遍历 +深度优先遍历:栈 +宽度优先遍历:队列 +## 栈实现队列 +1. 设置push栈和pop栈,两个来回倒,push压入,弹出时push中的数据放入pop中,从pop中弹出。(一次性倒完,) +## 队列实现栈 +1. 压栈放入一个队列中,需要弹栈的时候将全部放入另一个队列中,留下最后一个弹出。 +2. 再次放入,再放在当前队列中存入,弹出的时候,再次导入另一个队列中,最后一个弹出。 +## 递归 +### 递归改非递归 +使用系统栈。树遍历。 +递归到动态规划。 +大化小,递归图。 +## Master公式分析递归时间复杂度 +子问题规模一致 +## 哈希表 HashMap +## 有序表 TreeMap +## 归并排序 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/算法/算法和数据结构体系学习班/5.归并排序及相关面试题.md b/算法/算法和数据结构体系学习班/5.归并排序及相关面试题.md new file mode 100644 index 0000000..c190ee4 --- /dev/null +++ b/算法/算法和数据结构体系学习班/5.归并排序及相关面试题.md @@ -0,0 +1,6 @@ +## 递归排序 +1. 归并分两边排序 +2. 合并,左右比较放入一个新的数据做那个 +## 归并 +1. 步长从1开始增加到数组长度。 +2. merge sort 把需要比较的数据变成有序的信息。 \ No newline at end of file diff --git a/算法/算法和数据结构体系学习班/6.归并排序附加题、随机快速排序.md b/算法/算法和数据结构体系学习班/6.归并排序附加题、随机快速排序.md new file mode 100644 index 0000000..e69de29 diff --git a/算法/算法和数据结构体系学习班/img/常数时间.png b/算法/算法和数据结构体系学习班/img/常数时间.png new file mode 100644 index 0000000..1d9c694 Binary files /dev/null and b/算法/算法和数据结构体系学习班/img/常数时间.png differ diff --git a/算法/算法和数据结构体系学习班/img/归并merge.png b/算法/算法和数据结构体系学习班/img/归并merge.png new file mode 100644 index 0000000..8be85ef Binary files /dev/null and b/算法/算法和数据结构体系学习班/img/归并merge.png differ diff --git a/算法/算法和数据结构体系学习班/img/手写/2.认识复杂度.jpg b/算法/算法和数据结构体系学习班/img/手写/2.认识复杂度.jpg new file mode 100644 index 0000000..ad06d8d Binary files /dev/null and b/算法/算法和数据结构体系学习班/img/手写/2.认识复杂度.jpg differ diff --git a/算法/算法和数据结构体系学习班/img/算法复杂度.png b/算法/算法和数据结构体系学习班/img/算法复杂度.png new file mode 100644 index 0000000..a6f7980 Binary files /dev/null and b/算法/算法和数据结构体系学习班/img/算法复杂度.png differ diff --git a/算法/算法思路记录.md b/算法/算法思路记录.md new file mode 100644 index 0000000..236ac19 --- /dev/null +++ b/算法/算法思路记录.md @@ -0,0 +1,37 @@ +## 问 + +1. 机器人上高楼,遇到比自己高的,减去差距,遇到比自己低的,加上差距(可能加到溢出),问,机器人多高能刚好通过大楼? +2. [2551. 将珠子放入背包中 - 力扣(LeetCode)](https://leetcode.cn/problems/put-marbles-in-bags/) +3. [2127. 参加会议的最多员工数 - 力扣(LeetCode)](https://leetcode.cn/problems/maximum-employees-to-be-invited-to-a-meeting/) +4. [1489. 找到最小生成树里的关键边和伪关键边 - 力扣(LeetCode)](https://leetcode.cn/problems/find-critical-and-pseudo-critical-edges-in-minimum-spanning-tree/) + + + + + + + + + + + + + + + + + + + + + + + +内向基环数 + +## 答 + +1. 二分法,从最低0开始到最高楼二分测试,测试值在0-max之间。 +2. 无论怎么分都有第一个和最后一个的和,从头到尾,数字两两求和(在那里分,价值就是这个的和),去最大的几个减去最小的几个。 +3. 拓扑排序根据入(为0)将不是环上的数据删除。 + diff --git a/算法/算法突击/2023,3,4/7.图.md b/算法/算法突击/2023,3,4/7.图.md new file mode 100644 index 0000000..474aa95 --- /dev/null +++ b/算法/算法突击/2023,3,4/7.图.md @@ -0,0 +1,17 @@ +# 图 + +有向图,无向图。 + +# 临界表 + +二维数组表示图 + +# 拓扑图 + +有向无环图 + +1. 列出二维表 +2. 找出每个点的入度 +3. 取出入度为0的节点,作为当前位置,多个并列排序 +4. 将取出节点到达节点的入度减1. +5. 循环3,4. \ No newline at end of file diff --git a/算法/资料地址.txt b/算法/资料地址.txt new file mode 100644 index 0000000..c49bf8d --- /dev/null +++ b/算法/资料地址.txt @@ -0,0 +1 @@ +https://cloud.fynote.com/share/s/7615 \ No newline at end of file