第34天--算法(牛客网剑指offer1)
1.JZ3 数组中重复的数字
public int duplicate (int[] numbers) {
int L = 0;
while(L < numbers.length) {
if(numbers[L] == L) {
L ++;
}else if(numbers[numbers[L]] == numbers[L]) {
return numbers[L];
}else {
swap(numbers,L,numbers[L]);
}
}
return -1;
}
public void swap(int arr[],int x,int y) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
2.JZ4 二维数组中的查找
public boolean Find(int target, int [][] array) {
int M = array.length;
int N = array[0].length;
int i = M - 1;
int j = 0;
while(i >= 0 && j < N) {
if(array[i][j] == target) {
return true;
}else if(array[i][j] > target) {
i --;
}else {
j ++;
}
}
return false;
}
3.JZ5 替换空格
public String replaceSpace (String s) {
if(s == null || s.length() == 0) {
return s;
}
char s1[] = s.toCharArray();
StringBuilder sb = new StringBuilder();
for(int i = 0;i < s1.length;i ++) {
sb.append(s1[i] == ' ' ? "%20" : s1[i]);
}
return sb.toString();
}
4.JZ6 从尾到头打印链表
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> ls = new ArrayList<>();
ListNode reverseListNode = new ListNode(-1);
while(listNode != null){
ListNode cur = listNode;
listNode = listNode.next;
cur.next = reverseListNode.next;
reverseListNode.next = cur;
}
while(reverseListNode.next != null){
ls.add(reverseListNode.next.val);
reverseListNode = reverseListNode.next;
}
return ls;
}
5.JZ7 重建二叉树
public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
HashMap<Integer,Integer> hm = new HashMap<>();
for(int i = 0;i < vin.length;i ++) {
hm.put(vin[i],i);
}
return process(pre,0,pre.length - 1,vin,0,vin.length - 1,hm);
}
public TreeNode process(int [] pre,int L1,int R1,int [] vin,int L2,int R2,HashMap<Integer,Integer> hm) {
if(L1 > R1) {
return null;
}
TreeNode res = new TreeNode(pre[L1]);
if(L1 == R1) {
return res;
}
int index = hm.get(pre[L1]);
res.left = process(pre,L1 + 1,index - L2 + L1,vin,L2,index - 1,hm);
res.right = process(pre,index - L2 + L1 + 1,R1,vin,index + 1,R2,hm);
return res;
}
6.JZ8 二叉树的下一个结点
public TreeLinkNode GetNext(TreeLinkNode pNode) {
//1.有右子树,要找到右子树的最左节点
if(pNode.right != null) {
pNode = pNode.right;
while(pNode.left != null) {
pNode = pNode.left;
}
return pNode;
}
//2.没有右子树,且是父节点的左节点
if(pNode.next != null && pNode.next.left == pNode) {
return pNode.next;
}
//3.没有右子树,且是父节点的右节点
if(pNode.next != null && pNode.next.right == pNode) {
pNode = pNode.next;
while(pNode.next != null && pNode.next.right == pNode) {
pNode = pNode.next;
}
return pNode.next;
}
return null;
}
7.JZ9 用两个栈实现队列
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
while(!stack2.isEmpty()) {
stack1.push(stack2.pop());
}
stack1.push(node);
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
public int pop() {
return stack2.pop();
}
8.JZ10 斐波那契数列
public int Fibonacci(int n) {
if(n <= 0) {
return 0;
}
if(n == 1 || n == 2) {
return 1;
}
int dp[] = new int[n + 1];
dp[1] = 1;
dp[2] = 1;
for(int i = 3;i < n + 1;i ++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
9.JZ11 旋转数组的最小数字
public int minNumberInRotateArray(int [] nums) {
if(nums == null || nums.length == 0) {
return -1;
}
int ans = Integer.MAX_VALUE;
int L = 0;
int R = nums.length - 1;
int M = 0;
while(L <= R) {
M = (L + R) >> 1;
if(nums[L] == nums[M] && nums[M] == nums[R]) {
ans = Math.min(ans,nums[L]);
while(L < M && nums[L] == nums[M]) {
L ++;
}
if(L == M) {
L = M + 1;
continue;
}
}else {
if(nums[M] > nums[L]) {
ans = Math.min(nums[L],ans);
L = M + 1;
}else if(nums[M] < nums[L]) {
ans = Math.min(nums[M],ans);
R = M - 1;
}else {
ans = Math.min(ans,nums[L]);
L = M + 1;
}
}
}
return ans;
}
10.JZ12 矩阵中的路径
public boolean hasPath (char[][] matrix, String word) {
if(word == null || word.length() == 0) {
return true;
}
char w[] = word.toCharArray();
for(int i = 0;i < matrix.length;i ++) {
for(int j = 0;j < matrix[0].length;j ++) {
if(process(matrix,w,0,i,j)) {
return true;
}
}
}
return false;
}
public boolean process (char[][] matrix,char[] word,int index,int i,int j) {
if(index == word.length) {
return true;
}else {
if(i < 0 || j < 0 || i == matrix.length|| j == matrix[0].length || matrix[i][j] != word[index]) {
return false;
}else {
char temp = matrix[i][j];
matrix[i][j] = '0';
boolean ans = process(matrix,word,index + 1,i + 1,j) ||
process(matrix,word,index + 1,i - 1,j) ||
process(matrix,word,index + 1,i,j + 1) ||
process(matrix,word,index + 1,i,j - 1);
matrix[i][j] = temp;
return ans;
}
}
}