leetcode 33 搜索旋转排序数组

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. // 二分查找
  4. int len = nums.length;
  5. int left = 0;int right = len-1;
  6. while(left<=right){
  7. int mid = (left+right)>>1;
  8. if(nums[mid]<=nums[right]){
  9. if(nums[mid]<=target&&nums[right]>=target){
  10. left = mid;
  11. break;
  12. }else{
  13. right = mid-1;
  14. }
  15. }else if(nums[mid]>=nums[left]){
  16. if(nums[left]<=target&&nums[mid]>=target){
  17. right = mid;
  18. break;
  19. }else{
  20. left = mid+1;
  21. }
  22. }
  23. }
  24. return binarySearch(nums,left,right,target);
  25. }
  26. public int binarySearch(int[] nums, int left, int right, int target){
  27. while(left<=right){
  28. int mid = (left+right)>>1;
  29. if(target>nums[mid]){
  30. left = mid+1;
  31. }else if(target<nums[mid]){
  32. right = mid-1;
  33. }else{
  34. return mid;
  35. }
  36. }
  37. return -1;
  38. }
  39. }

leetcode34 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。

  1. //v1.0 双指针,时间复杂度O(N),效率不行
  2. class Solution {
  3. public int[] searchRange(int[] nums, int target) {
  4. int low = 0;
  5. int high = nums.length-1;
  6. if(nums.length==0) return new int[]{-1,-1};
  7. boolean flag = false;
  8. while(low<=high){
  9. flag = false;
  10. if(nums[low]>target||nums[high]<target) return new int[]{-1,-1};
  11. if(nums[low]<target){
  12. low++;
  13. flag = true;
  14. }
  15. if(nums[high]>target) {
  16. high--;
  17. flag = true;
  18. }
  19. if(!flag) break;
  20. }
  21. if(low<=high){
  22. return new int[]{low,high};
  23. }else{
  24. return new int[]{-1,-1};
  25. }
  26. }
  27. }
  28. //v2.0 二分法
  29. class Solution {
  30. public int[] searchRange(int[] nums, int target) {
  31. int[] res = new int[]{-1,-1};
  32. res[0] = BinaryResearch(nums,target,true);
  33. res[1] = BinaryResearch(nums,target,false);
  34. return res;
  35. }
  36. //leftOrRight表示寻找的是开始位置还是结束位置
  37. public int BinaryResearch(int[] nums, int target, boolean leftOrRight){
  38. int left=0,right=nums.length-1,res=-1;
  39. while(left<=right){
  40. int mid = left+(right-left)/2;
  41. if(nums[mid]>target){
  42. right = mid-1;
  43. }else if(nums[mid]<target){
  44. left = mid+1;
  45. }else{
  46. res = mid;
  47. if(leftOrRight){
  48. right = mid-1;
  49. }else{
  50. left = mid+1;
  51. }
  52. }
  53. }
  54. return res;
  55. }
  56. }

leetcode 35 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

  1. class Solution {
  2. public int searchInsert(int[] nums, int target) {
  3. int high = nums.length-1;
  4. int low = 0;
  5. int mid=0;
  6. if(nums.length==0) return -1;
  7. while(high>=low){
  8. mid = low + (high-low)/2;
  9. if(nums[mid]==target){
  10. return mid;
  11. }else if(target>nums[mid]){
  12. low = mid+1;
  13. }else{
  14. high = mid-1;
  15. }
  16. }
  17. if(nums[mid]>target) return mid;
  18. else return mid+1;
  19. }
  20. }

leetcode 328 奇偶链表

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

  1. class Solution {
  2. public ListNode oddEvenList(ListNode head) {
  3. if(head==null||head.next==null) return head;
  4. //奇结点
  5. ListNode odd = head;
  6. //偶结点
  7. ListNode even = head.next;
  8. ListNode temp = even;
  9. while(odd.next!=null&&even.next!=null){
  10. //奇结点移动
  11. odd.next = even.next;
  12. odd = odd.next;
  13. //偶结点移动
  14. even.next = odd.next;
  15. even = even.next;
  16. }
  17. //拼接头尾
  18. odd.next = temp;
  19. return head;
  20. }
  21. }