怎樣應對IT面試與筆試-(七)

Binary Search(二分法,或者叫折半查找)

167. Two Sum II - Input array is sorted

我們來看使用二分法來解決此問題,二分法使用的前提是有序纳令。

class Solution {
public:
    int BinSearch(vector<int>& numbers,int left, int right, int target)
    {
        while(left <= right)
        {
            int mid = left + (right - left) / 2;
            if(numbers[mid] == target) 
                return mid;
            else if(numbers[mid] < target)
                left = mid + 1;
            else 
                right = mid - 1;
        }
        return -1;
    }
    
    vector<int> twoSum(vector<int>& numbers, int target) {
        for(int i = 0; i < numbers.size()-1; ++i)
        {
            int remainingTarget = target - numbers[i];
            int left = i + 1;
            int right = numbers.size() - 1;
            int index2 = BinSearch(numbers, left, right,remainingTarget);
            if(index2!=-1)
            {
                return {i+1, index2+1};
            }
        }
        return {-1,-1};
        
    }
};

以2,7,11,15為例
(1)i = 0, remainingTarget = 9-2=7, left=1, right=3, 進入函數(shù)BinSearch
(2)在7, 11, 15中利用二分查找確認7的位置

二分查找.png

Divide and Conquer(分而治之)

快速排序qsort是分而治之技巧的典型應用柠贤,使用前提整體解題思路與部分解題思路是一致的。
例如將6 1 2 7 9 3 4 5 10 8進行快速排序

快速排序-二分法.png

(1)選擇第一個元素(6)為基準雷滋,把小于6的元素放左邊不撑,大于6的元素放右邊,即:3 1 2 5 4 6 9 7 10 8
(2)這樣數(shù)組分為了兩部分晤斩,3 1 2 5 4與9 7 10 8
(3)在3 1 2 5 4中焕檬,依然選第一個元素3位基準,把小于3的放左邊澳泵,大于3的放右邊:2 1 3 5 4
(4)我們又得到了2 1與5 4
(5)2 1以2為基準調(diào)整实愚,變?yōu)? 2,5 4以5為基準調(diào)整兔辅,變?yōu)? 5腊敲,所以2 1 3 5 4變?yōu)榱? 2 3 4 5
(6)同理 9 7 10 8經(jīng)過處理變?yōu)? 8 9 10,最后得到的序列如下:1 2 3 4 5 6 9 7 10 8

繼續(xù)解釋下如何把數(shù)組6 1 2 7 9 3 4 5 10 8以6為基準分成兩部分(下面的partition函數(shù)操作)维苔,使得小于6的部分在左邊碰辅,大于6的部分在右邊。這里用到了上面的Tow Pointers(輔助指針)的技巧


qsort-partition.png

(1)有L和R兩個指針介时,分別指向第二個元素和最后一個元素
(2)L指針一直向右掃描没宾,直到遇到第一個大于6的數(shù)字7忍法;R指針一直向左掃描,直到遇到第一個小于6的數(shù)字5, 交換這兩個數(shù)字
(3)L指針繼續(xù)向右掃描榕吼,遇到大于6的數(shù)字9饿序;R指針一直向左掃描,遇到小于6的數(shù)字4羹蚣,交換這兩個數(shù)字
(3)重復第二個步驟原探,一直到L和R指針重疊(元素3),交換基準6和重疊元素3

void Swap(int a[] ,int left,int right)   
{
    int tmp; 
    tmp=a[left];  
    a[left]=a[right];   
    a[right]=tmp;  
}   

int partition(int a[],int left,int right)     
{   
    int point=a[left];    
    //基準點定位為第一個元素     
    int firstPosition = left;   
    while( left< right)    
    {  
      //從右往左尋找小于point的元素    
        while( left< right&& a[right] >= point )   
            right--; //移到前一個元素     

      //從左往右尋找大于point的元素   
       while( left< right&& a[left] <= point)     
           left++; //移到下一個元素   
      
      //交換兩個元素 
       Swap(a,left,right);    
    }
    //交互基準元素與最后重疊元素位置
    Swap(a,firstPosition, left);
    return left;  
} 

void QSort(int a[],int left,int right)    
{   
    int point;//定義變量存放基準點     
    if( left< right)  
    {     
        point=partition(a,left,right);//對基準點定位     
       //對基準點左邊進行遞歸調(diào)用   
       QSort(a,left,point-1);    
       //對基準點右邊進行遞歸調(diào)用
       QSort(a,point+1,right);   
     }  
}   

215. Kth Largest Element in an Array

尋找數(shù)組的第k大元素
給出數(shù)組[3,2,1,5,6,4] 顽素,k = 2, return 5.

很多種技巧都可以解決上面的題目咽弦,例如暴力搜索(第一遍找到最大的,第二遍找到第二大胁出。型型。。)全蝶、sort(先排序闹蒜,再定位第k大)、哈希表(multiset)抑淫,最大堆(priority_queue)癌幕,在這里我們用分而治之思想來解決嫡锌。

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        int left = 0, right = nums.size() - 1;
        while (true) {
            int pos = partition(nums, left, right);
            if (pos == k - 1) return nums[pos];
            else if (pos > k - 1) right = pos - 1;
            else left = pos + 1;
        }
    }
    int partition(vector<int>& nums, int left, int right) {
        int pivot = nums[left], l = left + 1, r = right;
        while (l <= r) {
            if (nums[l] < pivot && nums[r] > pivot) {
                swap(nums[l++], nums[r--]);
            }
            if (nums[l] >= pivot) ++l;
            if (nums[r] <= pivot) --r;
        }
        swap(nums[left], nums[r]);
        return r;
    }
};

從上面qsort中的partition函數(shù)我們可以受到啟發(fā),每次partition完后比基準數(shù)小的都放右邊邊旨怠,比基準數(shù)大的都放在左邊和簸,如果基準數(shù)整好在(k-1)下標上法绵,則基準數(shù)就是第k大數(shù)徽曲。如果不在呜舒,則利用返回的下標幫我們縮小查找范圍。下面以3,2,1,5,6,4為例說明:


215.png

(1)第一次以3為基準荣月,大于3的放左邊管呵,小于3的放右邊,partition完后3的下標是3喉童,大于(k-1=1)撇寞,第二大元素肯定位于左邊顿天。
(2)第二次以5為基準堂氯,大于5的放左邊,小于5的放右邊牌废,partition完后5的下標是1咽白,等于(k-1=1)

怎樣應對IT面試與筆試-(一)
怎樣應對IT面試與筆試-(二)
怎樣應對IT面試與筆試-(三)
怎樣應對IT面試與筆試-(四)
怎樣應對IT面試與筆試-(五)
怎樣應對IT面試與筆試-(五-1)
怎樣應對IT面試與筆試-(六)
怎樣應對IT面試與筆試-(七)
怎樣應對IT面試與筆試-(八)
怎樣應對IT面試與筆試-(九)
怎樣應對IT面試與筆試-(十)
怎樣應對IT面試與筆試-(十一)
怎樣應對IT面試與筆試-(十二)
怎樣應對IT面試與筆試-(十三)
怎樣應對IT面試與筆試-(十四)
怎樣應對IT面試與筆試-(十五)
怎樣應對IT面試與筆試-(十六)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸟缕,隨后出現(xiàn)的幾起案子晶框,更是在濱河造成了極大的恐慌排抬,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件授段,死亡現(xiàn)場離奇詭異蹲蒲,居然都是意外死亡,警方通過查閱死者的電腦和手機侵贵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門届搁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窍育,你說我怎么就攤上這事卡睦。” “怎么了漱抓?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵表锻,是天一觀的道長。 經(jīng)常有香客問我乞娄,道長瞬逊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任仪或,我火速辦了婚禮码耐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溶其。我一直安慰自己骚腥,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布瓶逃。 她就那樣靜靜地躺著束铭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厢绝。 梳的紋絲不亂的頭發(fā)上契沫,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音昔汉,去河邊找鬼懈万。 笑死,一個胖子當著我的面吹牛靶病,可吹牛的內(nèi)容都是我干的会通。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼娄周,長吁一口氣:“原來是場噩夢啊……” “哼涕侈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煤辨,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裳涛,失蹤者是張志新(化名)和其女友劉穎木张,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體端三,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡舷礼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了郊闯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片且轨。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虚婿,靈堂內(nèi)的尸體忽然破棺而出旋奢,到底是詐尸還是另有隱情,我是刑警寧澤然痊,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布至朗,位于F島的核電站,受9級特大地震影響剧浸,放射性物質(zhì)發(fā)生泄漏锹引。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一唆香、第九天 我趴在偏房一處隱蔽的房頂上張望嫌变。 院中可真熱鬧,春花似錦躬它、人聲如沸腾啥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倘待。三九已至,卻和暖如春组贺,著一層夾襖步出監(jiān)牢的瞬間凸舵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工失尖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啊奄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓掀潮,卻偏偏與公主長得像菇夸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胧辽,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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

  • 姓名:周小蓬 16019110037 轉(zhuǎn)載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,727評論 13 425
  • 【1】7峻仇,9公黑,-1邑商,5摄咆,( ) A、4人断;B吭从、2;C恶迈、-1涩金;D、-3 分析:選D暇仲,7+9=16步做;9+(-1)=8;(...
    Alex_bingo閱讀 18,951評論 1 19
  • 今天是學校組織的本學期最后一次讀書會奈附,我們選擇在山下一家素食餐廳芊月茗開全度,是一個家長的店,感謝這位家長為我們免費提...
    一粒麥田閱讀 216評論 1 4
  • 努力不一定有收獲斥滤,但是不努力一定不會成功将鸵。 大家期盼已久的《歡樂頌2》已經(jīng)開演了,不知道大家對于里面...
    濰坊谷德DDM徐芳閱讀 198評論 14 0
  • 迷上了看封面猜故事佑颇。形狀游戲顶掉,畫框給出了答案,就是把某個形狀變成一個具體的畫挑胸。那小男孩在正中干嘛痒筒?他和形狀游戲之間...
    青棠1218閱讀 266評論 0 0