算法:數(shù)組(二)

283. 移動(dòng)零 - 力扣(LeetCode) (leetcode-cn.com)

數(shù)組nums, 把0移動(dòng)到末尾,同時(shí)保持非零元素的相對(duì)順序
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]

思路:雙指針

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums){
    key = 0; // 0-key非零元素
    for(let i = 0; i < nums.length; i++) {
         if(nums[i]){
              nums[key] = nums[i];
              key++
         }
    }
    for(let i = key; i < nums.length; i++)  {
      nums[i] = 0
    }
}
27. 移除元素 - 力扣(LeetCode) (leetcode-cn.com)

一個(gè)數(shù)組 nums和一個(gè)值 val躏升,你需要 原地 移除所有數(shù)值等于 val的元素,并返回移除后數(shù)組的新長度贞绳。
輸入:nums = [3,2,2,3], val = 3
輸出:2, nums = [2,2]

思路:從后向前遍歷,splice(索引, 刪除的個(gè)數(shù))

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
 var removeElement = function(nums, val) {
    for(let i=nums.length-1; i>=0; i--) {
      if(nums[i] === val) {
         nums.splice(i, 1)
      }
    }
    return nums.length
}
26. 刪除有序數(shù)組中的重復(fù)項(xiàng) - 力扣(LeetCode) (leetcode-cn.com)

一個(gè)有序數(shù)組 nums 致稀,請(qǐng)你 原地 刪除重復(fù)出現(xiàn)的元素冈闭,使每個(gè)元素 只出現(xiàn)一次 ,返回刪除后數(shù)組的新長度抖单。
輸入:nums = [1,1,2]
輸出:2, nums = [1,2]

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    for(let i=nums.length-1; i>= 0; i--) {
      if(nums[i]===nums[i-1]){
         nums.splice(i, 1)
      }
   }
   return nums.length
}
80. 刪除有序數(shù)組中的重復(fù)項(xiàng) II - 力扣(LeetCode) (leetcode-cn.com)

一個(gè)有序數(shù)組 nums 萎攒,請(qǐng)你 原地 刪除重復(fù)出現(xiàn)的元素,使每個(gè)元素 最多出現(xiàn)兩次 矛绘,返回刪除后數(shù)組的新長度耍休。
輸入:nums = [1,1,1,2,2,3]
輸出:5, nums = [1,1,2,2,3]

/**
 * @param {number[]} nums
 * @return {number}
 */
 var removeDuplicates = function (nums){
      if(nums.length <= 2) return nums.length;
      let count = 0;
      for(let i = nums.length-1; i >= 0;) {
          if(nums[i] === nums[i-1]) {
              count++
              if(count > 1) {
                   nums.splice(i, 1);
                   count = 0;
               } else{
                   i--
               }
          } else {
               i--;
               count = 0
          }
      }
       return nums.length
}
75. 顏色分類 - 力扣(LeetCode) (leetcode-cn.com)

給定一個(gè)包含紅色、白色和藍(lán)色货矮,一共 n 個(gè)元素的數(shù)組羊精,原地對(duì)它們進(jìn)行排序,使得相同顏色的元素相鄰囚玫,并按照紅色喧锦、白色、藍(lán)色順序排列抓督。
此題中裸违,我們使用整數(shù) 0、 1 和 2 分別表示紅色本昏、白色和藍(lán)色。
輸入:nums = [2,0,2,1,1,0]
輸出:[0,0,1,1,2,2]

思路:三路快排(本質(zhì)是交換)

三路快排.png
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
function swap(nums, i, j){
  let temp = nums[i];
  nums[i] = nums[j];
  nums[j] = temp
}
var sortColors = function(nums) {
    let zero = -1; // nums[0...zero] === 0, 注意是前閉區(qū)間后閉區(qū)間
    let two = nums.length; // nums[two...n-1] === 2
    for(let i=0; i < two;) {
        if(nums[i] === 1) {
           i++
        } else if(nums[i] === 2) {
           swap(nums, i, --two)
       } else { // 為0的情況
           swap(nums, ++zero, i++)
       }
    }
}
88. 合并兩個(gè)有序數(shù)組 - 力扣(LeetCode) (leetcode-cn.com)

兩個(gè)有序整數(shù)數(shù)組 nums1 和 nums2枪汪,請(qǐng)你將 nums2 合并到 nums1 中涌穆,使 nums1 成為一個(gè)有序數(shù)組怔昨。
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]

思路:歸并排序
歸并排序會(huì)開辟一個(gè)長度為nums1 + nums2的數(shù)組
從后向前遍歷

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    m--;
    n--;
    let l = nums1.length -1 // nums1的長度
    while(m >= 0 && n >= 0) {
        if(nums1[m] > nums2[n]) {
             nums1[l] = nums1[m];
             l--;
             m--;
        } else {
             nums1[l] = nums2[n];
             l--;
             n--;
        }
    }
    while(n >= 0) nums1[l--] = nums2[n--]
    return nums1;
}
215. 數(shù)組中的第K個(gè)最大元素 - 力扣(LeetCode) (leetcode-cn.com)

在未排序的數(shù)組中找到第 k 個(gè)最大的元素
需要找的是數(shù)組排序后的第 k 個(gè)最大的元素,而不是第 k 個(gè)不同的元素宿稀。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    for(let i=0; i< nums.length; i++){
        for(let j=i+1; j<nums.length; j++){
            if(nums[j]>nums[i]){
                const temp = nums[j]
                nums[j] = nums[i]
                nums[i] = temp
            }
        }
    }
    return nums[k-1]
};
167. 兩數(shù)之和 II - 輸入有序數(shù)組 - 力扣(LeetCode) (leetcode-cn.com)

給定一個(gè)已按照 升序排列 的整數(shù)數(shù)組 numbers 趁舀,請(qǐng)你從數(shù)組中找出兩個(gè)數(shù)滿足相加之和等于目標(biāo)數(shù) target
輸入:numbers = [2,7,11,15], target = 9
輸出:[1,2]
解釋:2 與 7 之和等于目標(biāo)數(shù) 9 。因此 index1 = 1, index2 = 2 祝沸。

思路:對(duì)撞指針

/**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(numbers, target) {
    let l = 0, r = number.length - 1;
    while(l < r) {
        if(numbers[l] + numbers[r] === target) {
             let res = [l+1, r+1] // 題目索引要求從1開始計(jì)算
             return res;
        } else if(numbers[l] + numbers[r] < target) {
            l++;
        } else{
            r--;
        }
    }
}
125. 驗(yàn)證回文串 - 力扣(LeetCode) (leetcode-cn.com)

給定一個(gè)字符串矮烹,驗(yàn)證它是否是回文串,只考慮字母和數(shù)字字符罩锐,可以忽略字母的大小寫
輸入: "A man, a plan, a canal: Panama"
輸出: true

思路:對(duì)撞指針

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
    // 匹配1-9a-zA-Z,正則所有大寫轉(zhuǎn)小寫
    // 替換所有與范圍a-zA-Z0-9不匹配的字符
    let sArray = s.replace(/[^0-9a-zA-Z]/g,'').toLowerCase()
    let l = 0, r = sArray.length - 1;
    while(l < r) {
       if(sArray[l] === sArray[r]) {
           l++;
           r--;
       } else{
           return false;
       }
    }
    return true
}
344. 反轉(zhuǎn)字符串 - 力扣(LeetCode) (leetcode-cn.com)

編寫一個(gè)函數(shù)奉狈,其作用是將輸入的字符串反轉(zhuǎn)過來。輸入字符串以字符數(shù)組 char[] 的形式給出涩惑。
原地修改輸入數(shù)組仁期、使用 O(1) 的額外空間解決這一問題。
輸入:["h","e","l","l","o"]
輸出:["o","l","l","e","h"]

對(duì)撞指針

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
function swap(array, l_index, r_index) {
    let temp = array[l_index];
    array[l_index] = array[r_index];
    array[r_index] = temp
}
var reverseString = function(s) {
      let l = 0, r = s.length - 1
      while(l < r) {
          swap(s, l, r)
          l++;
          r--;
      }
      return s
}
345. 反轉(zhuǎn)字符串中的元音字母 - 力扣(LeetCode) (leetcode-cn.com)

編寫一個(gè)函數(shù)竭恬,以字符串作為輸入跛蛋,反轉(zhuǎn)該字符串中的元音字母

思路: 對(duì)撞指針

/**
 * @param {string} s
 * @return {string}
 */
function swap(array, l_index, r_index){
    let temp = array[l_index];
    array[l_index] = array[r_index];
    array[r_index] = temp
}
var reverseVowels = function(s) {
    let vowel = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
    s = s.split('') // 字符串轉(zhuǎn)數(shù)組
    let l = 0, r = s.length - 1
    while(l < r) {
        if(vowel.includes(s[l])){
             l = l
        } else {
            l++
        }
        if(vowel.includes(s[r])){
           r = r
        } else {
            r--
        }
        if(vowel.indexOf(s[l]) != -1 && vowel.indexOf(s[r]) != -1) {
            swap(s, l, r)
            l++;
            r--;
        }
    }
    return s.join("")
}
11. 盛最多水的容器 - 力扣(LeetCode) (leetcode-cn.com)
image.png

輸入:[1,8,6,2,5,4,8,3,7]
輸出:49
解釋:圖中垂直線代表輸入數(shù)組 [1,8,6,2,5,4,8,3,7]。在此情況下痊硕,容器能夠容納水(表示為藍(lán)色部分)的最大值為 49

思路:對(duì)撞指針

var maxArea = function(height) {
    let l = 0, r = height.length - 1;
    let max = 0;
    while(l < r) {
        let area = Math.min(height[l], height[r]) * (r - l)
        let max = 0;
        if( area > max) {
            max = area
        }
        if(height[r] < height[l]) {
             const lastl = height[l]
             l++;
             while(height[l] <= lastl && l < r) {
                  l++;
             }
        } else {
             const lastr = height[r]
             r--;
             while(lastr >= height[r] && l < r) {
                  r--;
             }
        }
    }
    return max;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赊级,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子岔绸,更是在濱河造成了極大的恐慌理逊,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亭螟,死亡現(xiàn)場(chǎng)離奇詭異挡鞍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)预烙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門墨微,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扁掸,你說我怎么就攤上這事翘县。” “怎么了谴分?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵锈麸,是天一觀的道長。 經(jīng)常有香客問我牺蹄,道長忘伞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮氓奈,結(jié)果婚禮上翘魄,老公的妹妹穿的比我還像新娘。我一直安慰自己舀奶,他們只是感情好暑竟,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著育勺,像睡著了一般但荤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涧至,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天腹躁,我揣著相機(jī)與錄音,去河邊找鬼化借。 笑死潜慎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蓖康。 我是一名探鬼主播铐炫,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蒜焊!你這毒婦竟也來了倒信?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤泳梆,失蹤者是張志新(化名)和其女友劉穎鳖悠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體优妙,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乘综,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了套硼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卡辰。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邪意,靈堂內(nèi)的尸體忽然破棺而出九妈,到底是詐尸還是另有隱情,我是刑警寧澤雾鬼,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布萌朱,位于F島的核電站,受9級(jí)特大地震影響策菜,放射性物質(zhì)發(fā)生泄漏晶疼。R本人自食惡果不足惜酒贬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冒晰。 院中可真熱鬧同衣,春花似錦、人聲如沸壶运。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒋情。三九已至,卻和暖如春耸携,著一層夾襖步出監(jiān)牢的瞬間棵癣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工夺衍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狈谊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓沟沙,卻偏偏與公主長得像河劝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矛紫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容