原创 反轉單詞順序

思路1 遞歸思想 //解法1:遞歸 public String reverseSentence1(String str) { return (str.lastIndexOf(" ")==-1)?str

原创 數組中第k小的元素

思路1 O(n)的算法,只有當我們可以修改輸入的數組時可用 從上一題中我們可以得到啓發,我們同樣可以基於Partition函數來解決這個問題。如果基於數組的第k個數字來調整,使得比第k個數字小的所有數字都位於數組的左邊,比第k個數字

原创 不用加減乘除做加法

思路 首先我們分析人們是如何進行十進制的加法的,比如是如何得出5+17=22的結果的? 實際上可以分三步進行:第一步只做各位相加不進位,此時相加的結果是12,第二步做進位,5+7中有進位,進位的值爲10;第三步,把前面的兩個結果加起

原创 連續子數組最大和

LeetCode的Maximum SubArray問題,主要有三種解法。 思路1 分治法Divide and Conquer Approach來解,這個分治法的思想就類似於二分搜索法,我們需要把數組一分爲二,分別找出左邊和右邊的最

原创 醜數

思路1 逐個判斷每個整數是不是醜數的解法,直觀但不夠高效。 所謂一個數m是另一個數n的因子,是指n能被m整除,也就是說n%m==0.根據醜數的定義,醜數只能被2,3,5整除。也就是說如果一個數能被2整除,我們把它連續除以2;如果能被

原创 LeetCode------Reverse Linked List

解法1:頭插法 算法思路:依次取原鏈表中的每一個節點,將其作爲第一個節點插入到新鏈表中,指針用來指向當前節點,p爲空時結束。 /* * 解法1: 頭插法,原鏈表上直接操作 */ public Lin

原创 和爲定值的連續正數序列

思路 有了數組中和爲定值的兩個數字的經驗,我們也考慮用兩個數small和big分別表示序列的最小值和最大值。首先把small初始化爲1,big初始化爲2.如果從small到big的序列的和大於s,我們可以從序列中去掉較小的值,也就是

原创 數組中出現次數超過一半的數字

思路1 基於Partition函數的O(n)算法,受快速排序的算法的啓發,在隨機快速排序的算法中,我們先在數組中隨機的選擇一個數字,然後調數組中數字的順序,使得比選中的數字小數字排在它的左邊,比選中的數字大的數字都排在它的右邊。比如

原创 約瑟夫環問題

思路1:鏈表模擬 普通解法,用鏈表的方法去模擬這個過程,N個人看作是N個鏈表節點,節點1指向節點2,節點2指向節點3,……,節點N-1指向節點N,節點N指向節點1,這樣就形成了一個環。然後從節點1開始1、2、3……往下報數,每報到M

原创 數組中的逆序對

思路1 最簡單的方法是順序數組,將每個數字與後面的比較,統計逆序對的個數,這種方法的時間複雜度爲O(n*n),這種方法會超時。這裏可以巧妙利用歸併排序的思想,只需在歸併排序的基礎上稍作修改即可! 我們以數組{10,5,6,8,4,7

原创 整數區間中1出現的次數

思路1 最簡單的方法,分別求從1到n之間每個數中的1的個數,由於整數n的位數爲O(logn),我們要判斷一個數有多少個1,需要判斷其每一位是否爲1,這樣一個數就需要判斷O(logn)次,而總共有n個數需要求,那麼該方法的時間複雜度爲

原创 字符串全排序

思路1 直接使用求解全排序問題的next_permutation() 函數,next_permutation() 的具體實現見Next Permutation package com.zhumq.leetcode; import

原创 兩個鏈表的公共節點

思路1 使用棧 從鏈表結點的定義可以看出,這兩個鏈表是單鏈表。如果兩個單向鏈表有公共的結點,那麼這兩個鏈表從某一結點開始,它們的m_pNext都指向同一個結點,但由於是單向鏈表的結點,之後他們所有結點都是重合的,不可能再出現分叉。

原创 數組中只出現1次的兩個數

思路 首先我們可以考慮下這個題目的簡化版——數組中除一個數字只出現1次外,其它數字都成對出現,要求儘快找出這個數字。根據異或運算的特點,直接異或一次就可以找出這個數字。 現在數組中有兩個數字只出現1次,直接異或一次只能得到這兩個數字

原创 數組中和爲定值的兩個數字

題目:輸入一個遞增排序的數組和一個數字s,在數組中查找兩個數,使得它們的和正好是s。如果有多對的和等於s,則輸出全部對。 思路 例如輸入數組{1,2,4,7,11,15}和數字15.由於4+11=15,因此輸出4和11. 最簡單肯定是