劍指offer 之 時間效率

2021-10-05 05:19:37 字數 3429 閱讀 8081

30. 最小的k個數

31. 連續子陣列的最大和

32. 從1到n整數中1出現的次數

33. 把陣列排成最小的數

題目描述

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

維護乙個計數器,碰到相同的就加一,否則減一,減到0後把當前的值設為從新開始計算的值。最後判斷這個值出現的次數是否是陣列商都的一半

public

intmorethanhalfnum_solution

(int

array)

int time =1;

int res = array[0]

;for

(int i =

1;i < array.length;i++

)else

if(res == array[i]

)else}if

(checkmore

(array, array.length,res)

)return0;

}private

boolean

checkmore

(int

array,

int len,

int result)}if

(num > len /2)

return

false;}

private

boolean

check

(int

array,

int len)

return

true

;}

題目描述

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

用乙個大頂堆來儲存,維護堆的大小為k ,然後開始與堆頂元素比較大小 比堆頂元素小就替換下來

public arraylist

getleastnumbers_solution

(int

input,

int k)

priorityqueue

queue =

newpriorityqueue

(new

comparator

()})

;int i =0;

while

(queue.

size()

< k)

for(

;i < input.length;i++)}

for(integer a : queue)

return res;

}

題目描述

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)

使用動態規劃方式 f[i]代表以i為結尾的最大值

f[i] = max( f[i - 1] + array[i], array[i])

同時維護乙個最大值res

public

intfindgreatestsumofsubarray

(int

array)

int res = integer.min_value;

int cur = array[0]

;for

(int i =

1; i< array.length;i++

)return res;

}

每次判斷前乙個和是否小於零 小於的話就從當前值開始算 不小於的話 就加上當前值 。最後每次判斷一下總和的大小

public

static

intfindgreatestsumofsubarray

(int

array)

int cur =0;

int res = integer.min_value;

for(

int i =

0;i < array.length;i++

)else

if(res < cur)

}return res;

}

題目描述

求出113的整數中1出現的次數,並算出1001300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。

從1到n開始判斷每個數是否帶有數字1,判斷方式就是先把數字%10 == 1 不等的話不管,然後把數字/10 得到除了各位的數字,接著%10 == 1 時間複雜度o(n*logn)

public

intnumberof1between1andn_solution

(int n)

int res =0;

for(

int i =

1;i <= n;i++

)return res;

}private

intget

(int n)

n = n /10;

}return num;

}

題目描述

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。

自己定義乙個新的比較大小的規則放到list 中 然後把list中的元素依次組合成乙個字串就是最小的數

public string printminnumber

(int

numbers)

arraylist

list =

newarraylist

<

>()

;for

(int a:numbers)

collections.

sort

(list,

newcomparator

()})

; string s ="";

for(

int a:list)

return s;

}

劍指offer 之 時間空間效率的平衡

題目描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。維護三個佇列,選擇三個佇列頭最小的數加入醜數陣列,同時將該最小的數乘以2,3,5放入三個佇列 public in...

劍指offer刷題記錄 時間效率

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。直觀的解法就是借用容器,遍歷整個陣列然後記錄出現次數再加上判斷語句,但這要要耗費大量的空間。試著思考怎麼快速找到乙個陣列 現次數超...

劍指offer 演算法 (時間空間效率的平衡)

題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。解析 根據醜數的定義,醜數應該是另乙個醜數乘以2 3或者5的結果 1除外 因此我們可以建立乙個陣列,裡面的數字是排好...