旋转子数组
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length == 0){
return 0;
}
int left = 0;
int right = array.length - 1;
int min = 0;
while(left <= right){
if(array[left] <= array[right]){
min = array[left];
}
int mid = (right + left)/2;
if(array[mid] > array[right]){
left = mid + 1;
}else if(array[mid] < array[right]){
right = mid;
}else{
right--;
}
}
return min;
}
}
斐波那契数列
public class Solution {
public int Fibonacci(int n) {
if(n < 2){
return n;
}
int first = 0;
int seconds = 1;
int sum = 1;
for(int i = 2; i <= n; ++i){
sum = first + seconds;
first = seconds;
seconds = sum;
}
return sum;
}
}
调整数组使得奇数在前偶数在后并且不能改变相对位置
public class Solution {
public void reOrderArray(int [] array) {
//插入排序的思想
for(int i = 1; i < array.length; ++i){
for(int j = i; j > 0;--j){
//满足元素交换的条件
if(array[j] % 2 == 1 && array[j - 1] % 2 == 0){
int temp = array[j - 1];
array[j-1] = array[j];
array[j] = temp;
}else{
break;
}
}
}
}
}
顺时针打印矩阵
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
if(matrix == null){
return null;
}
int x1 = 0;
int y1 = 0;
int x2 = matrix.length -1 ;
int y2 = matrix[0].length - 1;
ArrayList<Integer> ret = new ArrayList<>();
while( x1 <= x2 && y1 <= y2){
print(x1++,y1++,x2--,y2--,matrix,ret);
}
return ret;
}
public void print(int x1,int y1,int x2,int y2,int[][] matrix,ArrayList<Integer> ret){
//打印第一行
for(int i = y1; i <= y2; ++i){
ret.add(matrix[x1][i]);
}
//打印右侧
if(x2 - x1 == 0){
return;
}else{
for(int i = x1 + 1; i <= x2; ++i){
ret.add(matrix[i][y2]);
}
}
//打印下边
if(y2 - y1 == 0){
return;
}else{
for(int i = y2 - 1; i >= y1; --i){
ret.add(matrix[x2][i]);
}
}
//打印最右边
for(int i = x2 - 1; i > x1; --i){
ret.add(matrix[i][y1]);
}
}
}
数组中出现次数超过一半的数字
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null){
return 0;
}
int count = 1;
int ret = array[0];
for(int i = 1; i < array.length; ++i){
if(count == 0){
ret = array[i];
count++;
}else if(ret != array[i]){
count--;
}else{
count++;
}
}
count = 0;
for(int i = 0; i < array.length; ++i){
if(ret == array[i]){
count++;
}
}
if(count > array.length/2){
return ret;
}
return 0;
}
}
最小的k个数
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> arr = new ArrayList<>();
if(input == null || input.length < k){
return arr;
}
Queue<Integer> heap = new PriorityQueue<>();
for(int i = 0; i < input.length; ++i){
heap.add(input[i]);
}
while(k-- != 0){
arr.add(heap.poll());
}
return arr;
}
}
最大连续子数组
import java.util.*;
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int[] dp = new int[array.length];
dp[0] = array[0];
int sum = array[0];
for(int i = 1; i < array.length; ++i){
dp[i] = Math.max(dp[i-1] + array[i],array[i]);
sum = Math.max(dp[i],sum);
}
return sum;
}
}
数组排成最小的数
import java.util.ArrayList;
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers == null){
return null;
}
ArrayList<String> arr = new ArrayList<>();
for(int i:numbers){
arr.add(Integer.toString(i));
}
Collections.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String A = o1 + o2;
String B = o2 + o1;
return A.compareTo(B);
}
});
String str = "";
for(String s:arr){
str = str + s;
}
return str;
}
}
在升序数组中元素出现的次数
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int left = 0;
int right = array.length -1;
//int index = -1;
int count = 0;
while(left <= right){
int mid = (left + right)/2;
if(array[mid] <k){
left = mid + 1;
}else if(array[mid] > k){
right = mid -1;
}else{
count = 1;
int first = mid - 1;
int second = mid + 1;
while(first >=0 || second<=array.length-1){
if(first>=0 && array[first] == k){
first--;
count++;
continue;
}
if(second <= array.length-1 && array[second] == k){
second++;
count++;
continue;
}
break;
}
break;
}
}
return count;
}
}
数组中只出现一次的数字
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
import java.util.*;
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int tmp = 0;
for(int i:array){
tmp ^= i;
}
ArrayList<Integer> arr1 = new ArrayList<>();
ArrayList<Integer> arr2 = new ArrayList<>();
int index = 0;
while(((tmp >> index++) & 1) == 1){}
for(int i:array){
if(((i >> index)&1) == 1){
arr1.add(i);
}else{
arr2.add(i);
}
}
for(int i:arr1){
num1[0] ^= i;
}
for(int i:arr2){
num2[0] ^= i;
}
}
}
和为s的两个数字
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
int left = 0;
int right = array.length - 1;
int result = Integer.MAX_VALUE;
int flag = 0;
ArrayList<Integer> arr = new ArrayList<>();
int[] tmp = new int[2];
while (left <= right) {
if (array[left] + array[right] < sum) {
left++;
} else if (array[left] + array[right] > sum) {
right--;
} else {
flag = 1;
if (array[left] * array[right] < result) {
tmp[0] = array[left];
tmp[1] = array[right];
result = array[left]*array[right];
}
left++;
}
}
if (flag == 1) {
arr.add(tmp[0]);
arr.add(tmp[1]);
}
return arr;
}
}