陣列和字串

Koonan-Edogawa發表於2024-08-03

陣列簡介

1. LeetCode 1991 找到陣列的中間位置

方法1:字首和

class Solution {
    public int findMiddleIndex(int[] nums) {
        int tol = 0, s = 0;
        for(int num : nums) 
            tol += num;
        for(int i = 0; i < nums.length; i++) {
            if(s == tol - s - nums[i])
                return i;
            s += nums[i];
        }
        return -1;
    }
}

2. LeetCode 35 搜尋插入位置

方法1:二分查詢

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length;
        while(left < right) {
            int mid = (left + right) >> 1;
            if(nums[mid] < target)
                left = mid + 1;
            else
                right = mid;
        }
        return left;
    }
}

3. LeetCode 56 合併區間

方法1:貪心

  • 排序 (a, b) -> a[0] - b[0]
  • 列表轉陣列 toArray(new int[M][N])
class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        List<int []> ans = new ArrayList<int []>();
        for(int[] info : intervals) {
            int n = ans.size(), left = info[0], right = info[1];
            // 陣列為空 或 區間不能合併
            if(n == 0 || ans.get(n - 1)[1] < left)
                ans.add(info);
            else // 進行合併區間
                ans.get(n - 1)[1] = Math.max(ans.get(n - 1)[1], right);
        }
        return ans.toArray(new int[ans.size()][2]);
    }
}
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key=lambda x: x[0])
        ans = list()
        for (left, right) in intervals:
            # 列表為空 或 區間不能合併
            if not ans or ans[-1][1] < left:
                ans.append([left, right])
            else: # 區間可以合併
                ans[-1][1] = max(ans[-1][1], right)
        return ans

二維陣列簡介

字串簡介

雙指標技巧

相關文章