leetcode 33 搜索旋转排序数组
class Solution {public int search(int[] nums, int target) {// 二分查找int len = nums.length;int left = 0;int right = len-1;while(left<=right){int mid = (left+right)>>1;if(nums[mid]<=nums[right]){if(nums[mid]<=target&&nums[right]>=target){left = mid;break;}else{right = mid-1;}}else if(nums[mid]>=nums[left]){if(nums[left]<=target&&nums[mid]>=target){right = mid;break;}else{left = mid+1;}}}return binarySearch(nums,left,right,target);}public int binarySearch(int[] nums, int left, int right, int target){while(left<=right){int mid = (left+right)>>1;if(target>nums[mid]){left = mid+1;}else if(target<nums[mid]){right = mid-1;}else{return mid;}}return -1;}}
leetcode34 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
//v1.0 双指针,时间复杂度O(N),效率不行class Solution {public int[] searchRange(int[] nums, int target) {int low = 0;int high = nums.length-1;if(nums.length==0) return new int[]{-1,-1};boolean flag = false;while(low<=high){flag = false;if(nums[low]>target||nums[high]<target) return new int[]{-1,-1};if(nums[low]<target){low++;flag = true;}if(nums[high]>target) {high--;flag = true;}if(!flag) break;}if(low<=high){return new int[]{low,high};}else{return new int[]{-1,-1};}}}//v2.0 二分法class Solution {public int[] searchRange(int[] nums, int target) {int[] res = new int[]{-1,-1};res[0] = BinaryResearch(nums,target,true);res[1] = BinaryResearch(nums,target,false);return res;}//leftOrRight表示寻找的是开始位置还是结束位置public int BinaryResearch(int[] nums, int target, boolean leftOrRight){int left=0,right=nums.length-1,res=-1;while(left<=right){int mid = left+(right-left)/2;if(nums[mid]>target){right = mid-1;}else if(nums[mid]<target){left = mid+1;}else{res = mid;if(leftOrRight){right = mid-1;}else{left = mid+1;}}}return res;}}
leetcode 35 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
class Solution {public int searchInsert(int[] nums, int target) {int high = nums.length-1;int low = 0;int mid=0;if(nums.length==0) return -1;while(high>=low){mid = low + (high-low)/2;if(nums[mid]==target){return mid;}else if(target>nums[mid]){low = mid+1;}else{high = mid-1;}}if(nums[mid]>target) return mid;else return mid+1;}}
leetcode 328 奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
class Solution {public ListNode oddEvenList(ListNode head) {if(head==null||head.next==null) return head;//奇结点ListNode odd = head;//偶结点ListNode even = head.next;ListNode temp = even;while(odd.next!=null&&even.next!=null){//奇结点移动odd.next = even.next;odd = odd.next;//偶结点移动even.next = odd.next;even = even.next;}//拼接头尾odd.next = temp;return head;}}
