LeetCode:125. Valid Palindrome和167. Two Sum II - Input array is sorted

雖然目前工作上不需要自己寫算法倚喂,但還是想寫點記錄下什么斋泄。這里推薦個刷題網(wǎng)站LeetCode杯瞻,如果你是個大學未畢業(yè)的學生,我認為做些算法題是非常有必要的炫掐,說不定能在未來的面試時中給你帶來驚喜又兵。接下去我會分享下我在做算法題時會用到的一些方法。本文及未來文章的代碼部分都是 C++,如果未接觸過的朋友沛厨,有必要了解如vector,map,set等在C++上是如何使用的宙地。
今天先來說下雙指針法。
首先是LeetCode上的125. Valid Palindrome

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.

就是給定一個字符串逆皮,判斷是不是回文的宅粥,是返回true,否的返回false电谣。
分析這道算法題:
1.題目中通過例子可以清楚看到不考慮標點符號和空格秽梅,所以在遍歷中遇到非自字符或數(shù)字要跳過;
2.這道題不需要考慮大小寫剿牺,所以在比較時要將大寫轉為小寫或者小寫轉為大寫企垦;
3.回文特點就是對稱,所以可以分別在兩端給設一個標記點晒来,左右比較(通過ASCII碼來比較)钞诡,如果遇到不相等,返回false湃崩,反之進行移動荧降,直到左邊的大于等于右邊的循環(huán)停止。
經(jīng)過上述分析攒读,下面就是這道題的一個AC解

class Solution {
public:
  //驗證是否是數(shù)字和字符
  bool isAlphanumeric(char c){
      if('a'<=c&&c<='z'||'A'<=c&&c<='Z'||'0'<=c&&c<='9'){
          return true;
      }else return false;
      
  }
  //大寫轉小寫
  char upperToLower(char c){  
      if('A' <= c && c <= 'Z') return c-'A'+'a';  
      else return c;  
  } 
  bool isPalindrome(string s) {
      if(s.size()==0) return true;//空字符直接返回
      int l=0,r=s.size()-1;//定義兩個起始點
      while(l<r){
          if(!isAlphanumeric(s[l])){//跳過非數(shù)字字符的情況
              l++;
          }else if(!isAlphanumeric(s[r])){//跳過非數(shù)字字符的情況
              r--;
          }else{
              if(lowerCase(s[l])==lowerCase(s[r])){//進行比較,相等繼續(xù)移動這2個標記點
                  l++;
                  r--;
              }else  return false;
          }
      }
      return true;
  }
};

接下去再來一道LeetCode上的167. Two Sum II - Input array is sorted

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution and you may not use the same element twice.

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

就是在一個有序數(shù)組中找到2個數(shù)相加等于給定的數(shù)朵诫,并返回這兩個數(shù)的在數(shù)組中的位置,這里的位置不是從0開始薄扁,所以下面要注意在索引的基礎上加1剪返。
分析這道算法題:
1.暴力解法就是2次遍歷,求出所有和邓梅,時間復雜度O(n^2)随夸,不一定能被AC。
2.其實通過有序這2個字震放,我們可以輕易得到一個O(n)的解法,在左右各設2個標記點驼修,分別為l和r,下面是偽代碼

if(target==numbers[l]+numbers[r]){
          //已經(jīng)找到了這2個數(shù)的索引l和r,記錄并分別加1后返回即可殿遂。
 }else if(target<numbers[l]+numbers[r]){
     r--;//此時2個數(shù)比目標數(shù)大,因為數(shù)組是從小到大有序的乙各,此時希望numbers[r]這個數(shù)變小
 }else{同理此時希望numbers[i]這個數(shù)變大
     l++;
  }

經(jīng)過上述分析墨礁,下面就是這道題的一個AC解

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int l=0,r=numbers.size()-1;
        vector<int> res;
        while(l<r){
            if(target==numbers[l]+numbers[r]){
                res.push_back(l+1);
                res.push_back(r+1);
                return res;
            }else if(target<numbers[l]+numbers[r]){
                r--;
            }else{
                l++;
            }
        }
        return res;
    }
};

那么如果數(shù)組是無序的呢,這個時候我們可以借助map來解決耳峦,等說到map的時候再來分享恩静。
今天的分享暫時先這樣了,下一篇會說下在雙指針基礎上,移動窗口的使用驶乾。

本文難免有紕漏和錯誤邑飒,如有發(fā)現(xiàn)敬請指正,謝謝级乐!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疙咸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子风科,更是在濱河造成了極大的恐慌撒轮,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贼穆,死亡現(xiàn)場離奇詭異题山,居然都是意外死亡,警方通過查閱死者的電腦和手機故痊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門顶瞳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崖蜜,你說我怎么就攤上這事浊仆。” “怎么了豫领?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵抡柿,是天一觀的道長。 經(jīng)常有香客問我等恐,道長洲劣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任课蔬,我火速辦了婚禮囱稽,結果婚禮上,老公的妹妹穿的比我還像新娘二跋。我一直安慰自己战惊,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布扎即。 她就那樣靜靜地躺著吞获,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谚鄙。 梳的紋絲不亂的頭發(fā)上各拷,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音闷营,去河邊找鬼烤黍。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的速蕊。 我是一名探鬼主播嫂丙,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼互例!你這毒婦竟也來了奢入?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤媳叨,失蹤者是張志新(化名)和其女友劉穎腥光,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糊秆,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡武福,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痘番。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捉片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汞舱,靈堂內(nèi)的尸體忽然破棺而出伍纫,到底是詐尸還是另有隱情,我是刑警寧澤昂芜,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布莹规,位于F島的核電站,受9級特大地震影響泌神,放射性物質(zhì)發(fā)生泄漏良漱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一欢际、第九天 我趴在偏房一處隱蔽的房頂上張望母市。 院中可真熱鬧,春花似錦损趋、人聲如沸患久。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒋失。三九已至,卻和暖如春括荡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溉旋。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工畸冲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓邑闲,卻偏偏與公主長得像算行,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苫耸,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

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