LeetCodet題解-雙指針

1承冰、兩數(shù)之和 || ->167.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

  • 題目描述:在有序數(shù)組中找出兩個(gè)數(shù),使它們的和為 target
  • 題解:使用雙指針咬荷,一個(gè)指針指向值較小的元素路呜,一個(gè)指針指向值較大的元素迷捧。指向較小元素的指針從頭向尾遍歷,指向較大元素的指針從尾向頭遍歷胀葱。
    • 如果兩個(gè)指針指向元素的和 sum == target漠秋,那么得到要求的結(jié)果;
    • 如果 sum > target抵屿,移動(dòng)較大的元素庆锦,使 sum 變小一些;
    • 如果 sum < target轧葛,移動(dòng)較小的元素搂抒,使 sum 變大一些。
    • 數(shù)組中的元素最多遍歷一次尿扯,時(shí)間復(fù)雜度為 O(N)求晶。只使用了兩個(gè)額外變量,空間復(fù)雜度為 O(1)衷笋。
public int[] twoSum(int[] numbers, int target) {
        int i=0,j=numbers.length-1;
        while(i<j){
            int sum=numbers[i]+numbers[j];
            if(sum==target){
                return new int[]{i+1,j+1};
            }else if(sum<target){
                i++;
            }else{
                j--;
            }
        }
        return null;
    }

2誉帅、平方數(shù)之和->633.

Input: 5
Output: True
Explanation: 1 * 1 + 2 * 2 = 5

  • 題目描述:判斷一個(gè)非負(fù)整數(shù)是否為兩個(gè)整數(shù)的平方和。
  • 題解:可以看成是在元素為 0~target 的有序數(shù)組中查找兩個(gè)數(shù)右莱,使得這兩個(gè)數(shù)的平方和為 target蚜锨,如果能找到,則返回 true慢蜓,表示 target 是兩個(gè)整數(shù)的平方和亚再。
    • 本題和上面那道題類(lèi)似,只有一個(gè)明顯區(qū)別:一個(gè)是和為 target晨抡,一個(gè)是平方和為 target氛悬。本題同樣可以使用雙指針得到兩個(gè)數(shù)则剃,使其平方和為 target。
    • 本題的關(guān)鍵是右指針的初始化如捅,實(shí)現(xiàn)剪枝棍现,從而降低時(shí)間復(fù)雜度。設(shè)右指針為 x镜遣,左指針固定為 0己肮,為了使 02 + x2 的值盡可能接近 target,我們可以將 x 取為 sqrt(target)悲关。
    • 復(fù)雜度分析:因?yàn)樽疃嘀恍枰闅v一次 0~sqrt(target)谎僻,所以時(shí)間復(fù)雜度為 O(sqrt(target))。又因?yàn)橹皇褂昧藘蓚€(gè)額外的變量寓辱,因此空間復(fù)雜度為 O(1)艘绍。
 public boolean judgeSquareSum(int c) {
        int i=0,j=(int)Math.sqrt((double)c);

        while(i<=j){
            if((i*i+j*j)==c){
                return true;
            }else if((i*i+j*j)>c){
                j--;
            }else{
                i++;
            }
        }
        return false;
    }

3、反轉(zhuǎn)字符串中的元音字符->345.

Given s = "leetcode", return "leotcede".

  • 題解:使用雙指針秫筏,一個(gè)指針從頭向尾遍歷诱鞠,一個(gè)指針從尾到頭遍歷,當(dāng)兩個(gè)指針都遍歷到元音字符時(shí)这敬,交換這兩個(gè)元音字符航夺。為了快速判斷一個(gè)字符是不是元音字符,我們將全部元音字符添加到集合 HashSet 中鹅颊,從而以 O(1) 的時(shí)間復(fù)雜度進(jìn)行該操作。
    • 時(shí)間復(fù)雜度為 O(N):只需要遍歷所有元素一次
    • 空間復(fù)雜度 O(1):只需要使用兩個(gè)額外變量
    • 注意:這里并不是位置對(duì)應(yīng)的墓造,如果是位置對(duì)應(yīng)的可以使用兩個(gè)StringBuilder來(lái)分別接收從小到大堪伍,和從大到小的兩個(gè)字符串,最后反轉(zhuǎn)一下拼接觅闽。
 private static final HashSet<Character> vowel=new HashSet<>(Arrays.asList('a','e','i','o','u','A','E','I','O','U'));
    public String reverseVowels(String s) {
        int i=0,j=s.length()-1;
        char[] result=new char[s.length()];
        while(i<=j){
            char ci=s.charAt(i);
            char cj=s.charAt(j);
            if(!vowel.contains(ci)){
                result[i++]=ci;
            }else if(!vowel.contains(cj)){
                result[j--]=cj;
            }else{
                result[i++]=cj;
                result[j--]=ci;
            }
    }
     return new String(result);
    }

4帝雇、回文字符串->680

Input: "abca"
Output: True
Explanation: You could delete the character 'c'.

  • 題目描述:可以刪除一個(gè)字符,判斷是否能構(gòu)成回文字符串蛉拙。
  • 所謂的回文字符串尸闸,是指具有左右對(duì)稱(chēng)特點(diǎn)的字符串,例如 "abcba" 就是一個(gè)回文字符串孕锄。
  • 題解
    • 本題的關(guān)鍵是處理刪除一個(gè)字符吮廉。在使用雙指針遍歷字符串時(shí),如果出現(xiàn)兩個(gè)指針指向的字符不相等的情況畸肆,我們就試著刪除一個(gè)字符宦芦,再判斷刪除完之后的字符串是否是回文字符串。
    • 注意:在出現(xiàn)不相等的時(shí)候不能簡(jiǎn)簡(jiǎn)單單的判斷一下是否和下一個(gè)相等就可以了轴脐,還要判斷后面全部的是不是相等调卑,因此這里使用函數(shù)的調(diào)用比較好抡砂。
public boolean validPalindrome(String s) {
    for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
        if (s.charAt(i) != s.charAt(j)) {
            return isPalindrome(s, i, j - 1) || isPalindrome(s, i + 1, j);
        }
    }
    return true;
}

private boolean isPalindrome(String s, int i, int j) {
    while (i < j) {
        if (s.charAt(i++) != s.charAt(j--)) {
            return false;
        }
    }
    return true;
}

5、歸并兩個(gè)有序數(shù)組->88

Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]

  • 題目描述:把歸并結(jié)果存到第一個(gè)數(shù)組上恬涧。注益。
  • 題解
    • 需要從尾開(kāi)始遍歷,否則在 nums1 上歸并得到的值會(huì)覆蓋還未進(jìn)行歸并比較的值溯捆。
public void merge(int[] nums1, int m, int[] nums2, int n) {
    int index1 = m - 1, index2 = n - 1;
    int indexMerge = m + n - 1;
    while (index1 >= 0 || index2 >= 0) {
        if (index1 < 0) {
            nums1[indexMerge--] = nums2[index2--];
        } else if (index2 < 0) {
            nums1[indexMerge--] = nums1[index1--];
        } else if (nums1[index1] > nums2[index2]) {
            nums1[indexMerge--] = nums1[index1--];
        } else {
            nums1[indexMerge--] = nums2[index2--];
        }
    }
}

6丑搔、判斷鏈表是否存在環(huán)->141

  • 題解
    • 使用雙指針,一個(gè)指針每次移動(dòng)一個(gè)節(jié)點(diǎn)现使,一個(gè)指針每次移動(dòng)兩個(gè)節(jié)點(diǎn)低匙,如果存在環(huán),那么這兩個(gè)指針一定會(huì)相遇
public boolean hasCycle(ListNode head) {
    if (head == null) {
        return false;
    }
    ListNode l1 = head, l2 = head.next;
    while (l1 != null && l2 != null && l2.next != null) {
        if (l1 == l2) {
            return true;
        }
        l1 = l1.next;
        l2 = l2.next.next;
    }
    return false;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碳锈,一起剝皮案震驚了整個(gè)濱河市顽冶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌售碳,老刑警劉巖强重,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異贸人,居然都是意外死亡间景,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)艺智,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倘要,“玉大人,你說(shuō)我怎么就攤上這事十拣》馀。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵夭问,是天一觀的道長(zhǎng)泽西。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缰趋,這世上最難降的妖魔是什么捧杉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮秘血,結(jié)果婚禮上味抖,老公的妹妹穿的比我還像新娘。我一直安慰自己灰粮,他們只是感情好非竿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谋竖,像睡著了一般红柱。 火紅的嫁衣襯著肌膚如雪承匣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天锤悄,我揣著相機(jī)與錄音韧骗,去河邊找鬼。 笑死零聚,一個(gè)胖子當(dāng)著我的面吹牛袍暴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隶症,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼政模,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蚂会?” 一聲冷哼從身側(cè)響起淋样,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胁住,沒(méi)想到半個(gè)月后趁猴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彪见,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年儡司,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片余指。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捕犬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酵镜,到底是詐尸還是另有隱情碉碉,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布笋婿,位于F島的核電站誉裆,受9級(jí)特大地震影響顿颅,放射性物質(zhì)發(fā)生泄漏缸濒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一粱腻、第九天 我趴在偏房一處隱蔽的房頂上張望庇配。 院中可真熱鬧,春花似錦绍些、人聲如沸捞慌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)啸澡。三九已至袖订,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗅虏,已是汗流浹背洛姑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皮服,地道東北人楞艾。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像龄广,于是被迫代替她去往敵國(guó)和親硫眯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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