LC 704. 二分查找

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. {
  4. /*
  5. 二分查找的时间复杂度:O(logn)
  6. */
  7. }
  8. int l = 0;
  9. int r = nums.length - 1;
  10. while (l < r) {
  11. int mid = (l + r) >> 1;
  12. if (nums[mid] >= target) {
  13. r = mid;
  14. } else {
  15. l = mid + 1;
  16. }
  17. }
  18. if (nums[l] != target) {
  19. return -1;
  20. } else {
  21. return l;
  22. }
  23. }
  24. }
  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. {
  4. /*
  5. 二分查找的时间复杂度:O(logn)
  6. */
  7. }
  8. int l = 0;
  9. int r = nums.length - 1;
  10. while (l < r) {
  11. int mid = (l + r) >> 1;
  12. // 找到结果就直接返回
  13. // 对第一种方法的优化
  14. if (nums[mid] == target) {
  15. return mid;
  16. } else if (nums[mid] > target) {
  17. r = mid - 1;
  18. } else {
  19. l = mid + 1;
  20. }
  21. }
  22. if (nums[l] != target) {
  23. return -1;
  24. } else {
  25. return l;
  26. }
  27. }
  28. }

LC 714. 买卖股票的最佳时机含手续费

股票问题系列通解

LC 763. 划分字母区间

思路:维护一个区间的左边界和右边界,在这个区间内遍历查看字符出现的最远位置,并更新右边界为新的最远位置。

  1. class Solution {
  2. public List<Integer> partitionLabels(String s) {
  3. int[] nums = new int[26];
  4. List<Integer> list = new ArrayList<>();
  5. Arrays.fill(nums, -1);
  6. // 记录字符出现的最远位置
  7. for (int i = 0; i < s.length(); i++) {
  8. nums[s.charAt(i) - 'a'] = i;
  9. }
  10. int left = 0;
  11. while (left < s.length()) {
  12. int right = nums[s.charAt(left) - 'a'];
  13. for (int i = left + 1; i < right; i++) {
  14. if (nums[s.charAt(i) - 'a'] > right) {
  15. right = nums[s.charAt(i) - 'a'];
  16. }
  17. }
  18. list.add(right - left + 1);
  19. left = right + 1;
  20. }
  21. return list;
  22. }
  23. }