选择排序
逻辑
1、在序列 arr 中找到最大(Max)或者最小(Min)的值,并将该值存在排序序列的起始位置。
2、再从剩下的原序列 arr 中找到最大(Max)或者最小(Min)的值,并将该值存在排序序列的末尾。
3、重复步骤 2 的操作。
JavaScript 代码实现123456789101112131415161718192021222324252627282930313233const arr = [1, 2, 6, 34, 7, 9, 11, 16, 13, 19, 0, 3]function selectionMaxSort(arr) { let len = arr.length for (let i = 0, max = len - 1; i < max; i++) { let MaxIndex = i for (let j = i + 1, max = len; j < max; j++) { if (arr[MaxIndex] < arr[j]) { MaxIndex = j ...
希尔排序
基本思想
将整个待排序序列进行的记录分割成若干个子序列,进行直接插入排序;待整个序列基本有序时,再对整个序列进行直接插入排序。
逻辑
1、选择一个增量序列 t1,t2….tk,其中 ti>tj,tk=1;
2、按增量序列个数 k,对序列进行 K 趟排序;
3、每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
JavaScript 代码实现12345678910111213141516171819202122232425262728293031323334353637const arr = [1, 9, 7, 10, 5, 8, 11, 14, 66, 0]function shellSort(arr) { let len = arr.length for (let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) { for ( ...
插入排序
逻辑
1、序列的第一个元素看成一个有序序列,第二个元素到序列末尾看成未排序序列;
2、取未排序序列的第一个元素与有序序列进行比较,并插到有序序列合适的位置;
3、重复步骤 2,直至未排序序列末尾为止。
JavaScript 代码实现12345678910111213141516const arr = [1, 2, 6, 34, 7, 9, 11, 16, 13, 19, 0, 3]function insertionSort(arr) { let len = arr.length for (let i = 1, max = len; i < max; i++) { let currentI = arr[i] let j = i - 1 // 把当前的元素与已排序列进行比较(从最后一位开始),如果已排序列元素大于当前元素,就把已排序列的元素向后移动一位,依次类推。 while (j >= 0 && arr[j] > currentI) { arr[j + 1] = arr[j] ...
冒泡排序
冒泡排序逻辑
1、比较两个相邻的元素 a、b,如果 a>b,则把 a、b 调换位置;反之,不调换位置。
2、从头到尾比较每一对相邻的元素,并且重复第一步的操作。操作完这步骤后,最后一位元素就是最大的元素。
3、针对所有元素重复以上的步骤(最后一位元素除外)。
JavaScript 代码实现123456789101112131415const arr = [1, 2, 6, 34, 7, 9, 11, 16, 13, 19, 0, 3]function bubbleSort(arr) { let len = arr.length for (let i = 0, max = len - 1; i < max; i++) { for (let j = 0, max = len - 1; j < max; j++) { if (arr[j] > arr[j + 1]) { let arrMax = arr[j] arr[j] = arr[j + 1] arr[j + ...
LeetCode 020:有效的括号
题目描述有效的括号
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:12输入:s = "()"输出:true
示例 2:12输入:s = "()[]{}"输出:true
示例 3:12输入:s = "(]"输出:false
Map 解答1234567891011121314151617181920212223242526const isValid = function (s) { if (s.length == 1) { return false } const sVar = new Map([ ['(', ')'], ['[', ']'], [' ...
LeetCode 049:字母异位词分组
题目地址https://leetcode.cn/problems/group-anagrams/
题目描述123456789101112131415161718给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1:输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]示例 2:输入: strs = [""]输出: [[""]]示例 3:输入: strs = ["a"]输出: [["a"]]
解答123456789101112cons ...
LeetCode 039:组合总和
题目地址
https://leetcode.cn/problems/combination-sum/
题目描述123456789101112131415161718192021222324252627给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。示例 1:输入:candidates = [2,3,6,7], target = 7输出:[[2,2,3],[7]]解释:2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。7 也是一个候选, 7 = 7 。仅有这两种组合。示例 2:输入: candidates = [2,3,5], target = 8输出: [[2,2,2,2],[2,3,3] ...
LeetCode 030:串联所有单词的子串
题目地址
https://leetcode.cn/problems/substring-with-concatenation-of-all-words/
题目描述1234567891011121314151617181920212223242526272829303132333435给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 ...
LeetCode 006:N 字形变换
题目地址
https://leetcode.cn/problems/zigzag-conversion/
题目描述1234567891011121314151617181920212223242526272829将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入:s = "PAYPALISHIRING", numRows = 3输出:"PAHNAPLSIIGYIR"示例 2:输入:s = "PAYPALISHIRING", numRows = 4输出:"PI ...
LeetCode 005:最长回文子串
题目地址
https://leetcode.cn/problems/longest-palindromic-substring/
题目描述12345678910111213给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"
解法一 中心扩散法由简入繁先看一个最简单的字符串,比如’aabaaabaa’;
第一步,i=0,这时候 res=’a’,如果回文子串长度是奇数,左边无值,右边有值,这时候最长回文子串是’a’,如果回文子串长度是偶数,res=’aa’这时候最长回文子串是’aa’;
第二步,i=1,这时候 res=’a’,如果回文子串长度是奇数,左边有一个值’a’,右边的值为’b’,这时候当前 i 位置最长回文子串是’a’,如果回文子 ...