LeetCode "Sword Finger Offer"、アイデアあり(27)

みなさん、こんにちは。私は方圆
持ってませんが、慣れています


ソードはオファー57-IIを指します。合計がsである連続した正の数のシーケンス

ここに画像の説明を挿入

  • アイデア:この種の順序付けされた配列の場合、最初にダブルポインターとスライディングウィンドウについて考えます。
class Solution {
    
    
    public int[][] findContinuousSequence(int target) {
    
    
        int i = 1;
        int j = 1;
        int sum = 0;
        List<int[]> res = new ArrayList<>();

        while(i <= target / 2){
    
    
            if(sum < target){
    
    
                sum += j;
                j++;
            }else if(sum > target){
    
    
                sum -= i;
                i++;
            }else{
    
    
                int[] arr = new int[j - i];
                for(int k = i;k < j;k++){
    
    
                    arr[k - i] = k;
                }
                res.add(arr);
                sum -= i;
                i++;
            }
        }

        return res.toArray(new int[res.size()][]);
    }
}

Sword Finger Offer 58-I。単語の順序を逆にする

ここに画像の説明を挿入

class Solution {
    
    
    public String reverseWords(String s) {
    
    
        s = s.trim();
        int i = s.length() - 1,j = i;
        StringBuilder res = new StringBuilder();

        while(i >= 0){
    
    
            while(i >= 0 && s.charAt(i) != ' ')
                i--;//将i指向单词前的空格
            res.append(s.substring(i + 1,j + 1) + " ");
            while(i >= 0 && s.charAt(i) == ' ')
                i--;//去掉两单词间多余的空格
            j = i;
        }

        //去掉尾部多余的一个空格
        return res.toString().trim();
    }
}

ソードフィンガーオファー58-II。ストリングを左に回転

ここに画像の説明を挿入

  • アイデア:2つのセクションにカット
class Solution {
    
    
    public String reverseLeftWords(String s, int n) {
    
    
        return s.substring(n,s.length()) + s.substring(0,n);
    }
}

ソードフィンガーオファー59-I。最大スライディングウィンドウ

ここに画像の説明を挿入

class Solution {
    
    
    public int[] maxSlidingWindow(int[] nums, int k) {
    
    
        if(nums == null || k == 0) return new int[0];

        int[] res = new int[nums.length - k + 1];
        int i = 0,j = k - 1;
        int n = 0;

        while(j < nums.length){
    
    
            int flag = Integer.MIN_VALUE;
            for(int a = 0;a < k;a++)
                flag = Math.max(flag,nums[i + a]);
            i++;
            j++;
            res[n++] = flag;
        }

        return res;
    }
}

剣はオファー59-IIを指します。キューの最大値

ここに画像の説明を挿入

class MaxQueue {
    
    

    private Queue<Integer> queue;
    private LinkedList<Integer> max;

    public MaxQueue() {
    
    
        queue = new LinkedList<>();
        max = new LinkedList<>();
    }
    
    public int max_value() {
    
    
        return max.size() != 0 ? max.getFirst() : -1;
    }
    
    public void push_back(int value) {
    
    
        queue.add(value);
        //这里是while循环条件!!!
        while(max.size() != 0 && max.getLast() < value)
            max.removeLast();
        max.add(value);
    }
    
    public int pop_front() {
    
    
        if(max.size() != 0 && max.getFirst().equals(queue.peek()))
            max.removeFirst();
        
        return queue.size() != 0 ? queue.poll() : -1;
    }
}

いい加減にして!

おすすめ

転載: blog.csdn.net/qq_46225886/article/details/107423272