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;
}
}