題目描述
數組中一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲 9 的數組{1,2,3,2,2,2,5,4,2}。由於數字 2 在數組中出現了 5 次,超過數組長度的一半,因此輸出 2.
解題思路
- 當我們遍歷到下一個數字的時候,
- 如果下一個數字和當前我們保存的數字相同,則次數加 1;
- 如果和當前我們保存的數字不同,則次數減 1;
- 當次數減到 0 的時候,我們將保存的數字改爲當前遍歷所處的位置,並將次數更改爲 1。時間複雜度O(n)
算法圖解
參考代碼:
package offer;
/**
* 數組中出現次數超過一半的數字
* 數組中一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲 9 的數組{1,2,3,2,2,2,5,4,2}。由於數字 2 在數組中出現了 5 次,超過數組長度的一半,因此輸出 2.
*/
public class Offer39 {
public static void main(String[] args) {
int nums[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};
System.out.println(findMoreHalf(nums));
}
/**
* O(n)
* @param nums
* @return
*/
static int findMoreHalf(int nums[]) {
if (nums == null || nums.length <= 1) {
return 0;
}
int tag = 1;
int result=nums[0];
for (int i = 0; i < nums.length - 1; i++) {
int curent = nums[i];
if (tag == 0) {
result= nums[i];
tag = 1;
}
if (curent == nums[i + 1]) {
tag++;
} else {
tag--;
}
}
return result;
}
}
題目描述(最小K個數)
輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。
解題思路
- 排序後輸出。時間複雜度O(nlogn)
算法圖解
參考代碼:
package offer;
import java.util.Arrays;
/**
* 最小的K個數
* 輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。
*/
public class Offer40 {
public static void main(String[] args) {
int nums[] = {4, 5, 1, 6, 2, 7, 3, 8};
int k = 5;
/**
* 排序後找
*/
Arrays.sort(nums);
for (int i = 0; i < k; i++) {
System.out.println(nums[i]);
}
}
}
附錄
該題源碼在我的 ?Github 上面!