Leetcode-Java(五)

41. First Missing Positive

class Solution {
    public int firstMissingPositive(int[] nums) {
        int I=0;
        while(i < nums.length){
            if(nums[i] != i+1 && nums[i]>0 && nums[i]<=nums.length && nums[nums[i]-1] != nums[I])
                swap(nums,i,nums[i]-1);
            else
                I++;
        }
        for(i=0;i<nums.length;i++)
            if(nums[i] != I+1)
                return I+1;
        return nums.length+1;
    }
    public static void swap(int[] nums,int i,int j){
        int temp = nums[I];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

42. Trapping Rain Water

思路1:

代碼:

class Solution {
    public int trap(int[] height) {
        if (height==null || height.length==0)
            return 0;
        int[] left_max = new int[height.length];
        int[] right_max = new int[height.length];
        left_max[0] = height[0];
        right_max[height.length-1] = height[height.length-1];
        for(int i = 1;i<height.length;i++){
            left_max[i] = Math.max(height[i],left_max[i-1]);
        }
        for(int j=height.length-2;j>=0;j--){
            right_max[j] = Math.max(height[j],right_max[j+1]);
        }
        int ans = 0;
        for(int i = 0;i<height.length;i++){
            ans += Math.min(left_max[i],right_max[i]) - height[I];
        }
        return ans;
    }
}

解法二:使用一個棧量淌,棧中保存下標,當插入一個新的下標時胚股,如果該下標對應的高度小于棧頂下標所對應的高度琅拌,那么直接插入摘刑,否則,將棧頂拋出即彪,然后根據(jù)當前棧頂和要插入的下標對應的高度來計算可以儲水的容量隶校,并將該元素插入棧中。

class Solution {
    public int trap(int[] height) {
        int ans = 0;
        if(height==null || height.length==0)
            return ans;
        int current = 0;
        Stack<Integer> stack = new Stack<Integer>();
        while(current < height.length){
            while(!stack.empty() && height[current]>height[stack.peek()]){
                int top = stack.peek();
                stack.pop();
                if(stack.empty())
                    break;
                ans += (Math.min(height[current],height[stack.peek()])-height[top]) * (current-stack.peek()-1);
            }
            stack.push(current);
            current ++;
        }
        return ans;
    }
}

44. Wildcard Matching

跟前面的第10題類似,用動態(tài)規(guī)劃的思路舞终,維護一個二維的數(shù)組敛劝。dp[i][j] 表示p[0...j-1]和s[0...i-1]是否相配,注意當p[j]為和不為兩種情況下如何判斷當前為true和false就行了蛾方。

class Solution {
    public boolean isMatch(String s, String p) {
        
        int row = p.length() + 1;
        int col = s.length() + 1;
        boolean[][] dp = new boolean[row][col];
        dp[0][0] = true;
        for(int i=1;i<col;i++){
            dp[0][i] = false;
        }
        for(int j=1;j<row;j++){
            if(p.charAt(j-1)=='*')
                dp[j][0] = dp[j-1][0];
            else
                dp[j][0] = false;
        }
        for(int i=1;i<col;i++)
            for(int j=1;j<row;j++){
                if(p.charAt(j-1)=='*'){
                    //要么是上面是true 要么是左邊是true桩砰,如果上面是true亚隅,此時*當空串使庶溶,如果左邊是true,那么此時*當一個字符使
                    if(dp[j-1][i] || dp[j][i-1])
                        dp[j][i]=true;
                    else
                        dp[j][i]=false;
                }
                else{
                    //如果不為*的話醉途,首先左上角的位置要是true,如果不是的話殴穴,s和p都增加一個字符也不會匹配采幌,同時s和p增加的字符要相同或者p是?
                    if(dp[j-1][i-1] && (p.charAt(j-1)==s.charAt(i-1) || p.charAt(j-1)=='?'))
                        dp[j][i] = true;
                    else
                        dp[j][i] = false;
                }
            }
        return dp[row-1][col-1];
    }
}

45. Jump Game II

stepCount代表步數(shù)征绎,curmax表示當前能夠走到的最大值人柿,chase代表上一步能走到的最大值凫岖,當我們遍歷到chase這的時候,curmax變成了在這一段里面能夠走到的最遠的地方歼指。比如2踩身,3社露,1,1赁濒,4拒炎,我們第一步最多走到索引為2的地方挨务,此時chase為0,curmax為2丁侄,第二步最多走到索引為4的地方鸿摇,此時chase為2劈猿,curmax為4。

class Solution {
    public int jump(int[] nums) {
        int stepCount = 0;
        int curmax = 0;
        int chase = 0;
        for(int i=0;i<nums.length-1;i++){
            curmax = Math.max(curmax,i+nums[I]);
            if(i==chase){
                stepCount++;
                chase = curmax;
            }
        }
        return stepCount;
    }
}

46. Permutations

回溯法的應用

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        backtracking(nums,new ArrayList<>(),list);
        return list;
    }
    public static void backtracking(int[] nums,ArrayList<Integer> now,List<List<Integer>> list){
        if(now.size() == nums.length){
            list.add(new ArrayList<Integer>(now));
        }
        else{
            for(int i=0;i<nums.length;i++){
                if(now.contains(nums[i])) continue;
                now.add(nums[I]);
                backtracking(nums,now,list);
                now.remove(now.size()-1);
            }
        }
    }
}

47. Permutations II

class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if(nums==null || nums.length==0) return res;
        boolean[] used = new boolean[nums.length];
        Arrays.sort(nums);
        backtracking(nums,used,new ArrayList<Integer>(),res);
        return res;
    }
    
    public static void backtracking(int[] nums,boolean[] used,ArrayList<Integer> arr,List<List<Integer>> res){
        if(arr.size() == nums.length)
            res.add(new ArrayList<Integer>(arr));
        else{
            for(int i=0;i<nums.length;i++){
                if(used[i]) continue;
                if(i>0 && nums[i-1]==nums[i] && used[i-1]) continue;
                used[i] = true;
                arr.add(nums[i]);
                backtracking(nums,used,arr,res);
                arr.remove(arr.size()-1);
                used[i] = false;
            }
        }
    }
}

48. Rotate Image

分兩步:


class Solution {
    public void rotate(int[][] matrix) {
        if(matrix==null || matrix.length==0)
            return;
        int col = matrix[0].length;
        int row = matrix.length;
        for(int i=0;i<row;i++){
            for(int j=0;j<col/2;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][col-j-1];
                matrix[i][col-j-1] = temp;
            }
        }
        for(int i=0;i<row;i++){
            for(int j=0;j<col-i-1;j++){
                int temp= matrix[i][j];
                matrix[i][j] = matrix[col-j-1][row-i-1];
                matrix[col-j-1][row-i-1] = temp;
            }
        }
    }
}

49. Group Anagrams

采用排序的方法,判斷兩個字符串是否相似

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs.length == 0) return new ArrayList();
        Map<String, List> ans = new HashMap<String, List>();
        for (String s : strs) {
            char[] ca = s.toCharArray();
            Arrays.sort(ca);
            String key = String.valueOf(ca);
            if (!ans.containsKey(key)) ans.put(key, new ArrayList());
            ans.get(key).add(s);
        }
        return new ArrayList(ans.values());
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末订歪,一起剝皮案震驚了整個濱河市损拢,隨后出現(xiàn)的幾起案子福压,更是在濱河造成了極大的恐慌,老刑警劉巖蒙幻,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邮破,死亡現(xiàn)場離奇詭異仆救,居然都是意外死亡,警方通過查閱死者的電腦和手機摧莽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門镊辕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚁袭,“玉大人,你說我怎么就攤上這事卖哎∩拘裕” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汗侵。 經(jīng)常有香客問我,道長发乔,這世上最難降的妖魔是什么雪猪? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任只恨,我火速辦了婚禮,結(jié)果婚禮上纵菌,老公的妹妹穿的比我還像新娘休涤。我一直安慰自己,他們只是感情好功氨,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布捷凄。 她就那樣靜靜地躺著,像睡著了一般踱阿。 火紅的嫁衣襯著肌膚如雪钦铁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天佛点,我揣著相機與錄音超营,去河邊找鬼。 笑死演闭,一個胖子當著我的面吹牛颓帝,可吹牛的內(nèi)容都是我干的窝革。 我是一名探鬼主播虐译,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼吴趴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厢拭?” 一聲冷哼從身側(cè)響起惊橱,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤税朴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后正林,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡鼻忠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年帖蔓,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞳脓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡埋酬,死狀恐怖写妥,靈堂內(nèi)的尸體忽然破棺而出审姓,到底是詐尸還是另有隱情,我是刑警寧澤魔吐,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站砸琅,受9級特大地震影響症脂,放射性物質(zhì)發(fā)生泄漏淫僻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一棕所、第九天 我趴在偏房一處隱蔽的房頂上張望悯辙。 院中可真熱鬧,春花似錦针贬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垃瞧。三九已至,卻和暖如春皆警,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背信姓。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工意推, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菊值。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓育灸,卻偏偏與公主長得像磅崭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子砸喻,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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

  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會員)割岛,僅算法題癣漆,的吐槽 https://leetc...
    蕾娜漢默閱讀 17,788評論 2 36
  • 動態(tài)規(guī)劃 111. 爬樓梯思路類似斐波那契數(shù)列注意考慮第 0 階的特殊情況 272. 爬樓梯 II思路類似上題剂买,只...
    6默默Welsh閱讀 2,431評論 0 1
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗瞬哼。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • 我們遇到的任何問題倒槐,盯著問題本身,是解決不了問題的讨越。 而答案,一定在別處人弓。就像上鎖的鎖頭着逐,鑰匙一定不是插在鎖孔里,...
    hakuxxx閱讀 308評論 3 2