刷题:greedy

55. 跳跃游戏

// 这题的循环条件index和maxIndex两个都变,比较少见
class Solution {
    public boolean canJump(int[] nums) {
        int N = nums.length;
        int maxIndex = nums[0];
        int index = 0;
        while (index <= maxIndex) {         // 注意小于等于
            maxIndex = Math.max(maxIndex, index + nums[index]);
            if (maxIndex >= N - 1) return true;
            index++;
        }
        return false;
    }  
}

45. 跳跃游戏II

// 每一步找到下一次最大覆盖范围,也是下一次遍历的终点
class Solution {
    public int jump(int[] nums) {
        int step = 0;
        int farest = 0;
        int index = 0;
        while (farest < nums.length - 1) {
            int tmp = farest;
            for (;index <= tmp; index++) {
                farest = Math.max(farest, index + nums[index]);
            }
            step++;
        }
        return step;
    }
}

781. 森林中的兔子

class Solution {
    public int numRabbits(int[] answers) {
        if (answers.length == 0) return 0;
        Map<Integer, Integer> counts = new HashMap<>();
        for (int ans : answers) {
            counts.put(ans, counts.getOrDefault(ans, 0) + 1);
        }
        int res = 0;
        for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
            int key = entry.getKey();
            int value = entry.getValue();
            res += (value + key) / (key + 1) * (key + 1);    // 向上取整
        }
        return res;
    }
}

11. 盛最多水的容器

// 头尾双指针,贪心策略移动指针
    class Solution {
        public int maxArea(int[] height) {
            int begin = 0;
            int end = height.length - 1;
            int ans = 0;
            while (begin < end) {
                int width = end - begin;
                if (height[begin] < height[end]) {
                    ans = Math.max(ans, width * height[begin]);
                    begin++;
                } else {
                    ans = Math.max(ans, width * height[end]);
                    end--;
                }
            }
            return ans;
        }
    }

179. 最大数

// 利用了字符串的字典排序
    class Solution {
        public String largestNumber(int[] nums) {
            String[] strings = new String[nums.length];
            for (int i = 0; i < nums.length; i++) {
                strings[i] = String.valueOf(nums[i]);
            }

            Comparator<String> cmp = (str1, str2) -> {
                String s1 = str1 + str2;
                String s2 = str2 + str1;
                return s2.compareTo(s1);
            };
            Arrays.sort(strings);

            if (strings[0].equals("0")) return "0";

            StringBuilder sb = new StringBuilder();
            for (String str : strings) {
                sb.append(str);
            }
            return sb.toString();
        }
    }

135. 分发糖果

// 一次遍历,记录上一次增长区间的长度,下一次减区间的长度大于这个长度时,需要多加1
class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        int ret = 1;
        int inc = 1, dec = 0, pre = 1;
        for (int i = 1; i < n; i++) {
            if (ratings[i] >= ratings[i - 1]) {
                dec = 0;
                pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
                ret += pre;
                inc = pre;
            } else {
                dec++;
                if (dec == inc) {
                    dec++;
                }
                ret += dec;
                pre = 1;
            }
        }
        return ret;
    }
}
// 分別满足左规则和有规则
    class Solution0 {
        public int candy(int[] ratings) {
            int N = ratings.length;
            int[] candies = new int[N];

            Arrays.fill(candies, 1);
            // 满足左规则
            for (int i = 1; i < N; i++) {
                if (ratings[i] > ratings[i-1]) {
                    candies[i] = candies[i-1] + 1;
                }
            }

            int sum = 0;
            for (int i = N - 2; i >= 0; i--) {
                if (ratings[i] > ratings[i+1]) {
                    candies[i] = Math.max(candies[i], candies[i+1] + 1);
                }
                sum += candies[i];
            }

            return sum + candies[N-1];
        }
    }

678. 有效的括号字符串

// lo 和 hi表示取值的区间,维护好这两个变量
class Solution {
    public boolean checkValidString(String s) {
        int lo = 0;
        int hi = 0;
        for (char c : s.toCharArray()) {
            lo += c == '(' ? 1 : -1;
            hi += c != ')' ? 1 : -1;
            if (hi < 0) return false;
            if (lo < 0) lo = 0;
        }
        return lo == 0;
    }
}

剑指Offer45. 把数组排成最小的数

// 字符串字典排序,类似与最大数
class Solution {
    public String minNumber(int[] nums) {
        int n = nums.length;
        String[] strings = new String[n];
        for (int i = 0; i < n; i++) {
            strings[i] = String.valueOf(nums[i]);
        }

        Comparator<String> cmp = (x, y) -> {
            String s1 = x + y;
            String s2 = y + x;
            return s1.compareTo(s2);
        };
        Arrays.sort(strings, cmp);
        
        StringBuilder sb = new StringBuilder();
        for (int index = 0; index < n; index++) {
            sb.append(strings[index]);
        }
        return sb.toString();
    }
}

134. 加油站

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int res = 0;
        int total = 0;
        int curSum = 0;
        for (int i = 0; i < gas.length; i++) {
            int diff = gas[i] - cost[i];
            total += diff;
            curSum += diff;
            if (curSum < 0) {
                res = i + 1;
                curSum = 0;
            }
        }
        if (total < 0) return -1;
        return res;
    }
}

410. 分割数组的最大值

// 二分查找,一次过
class Solution {
        public int splitArray(int[] nums, int m) {
            int left = 0;
            int right = 0;
            for (int num : nums) {
                right += num;
                if (left < num) {
                    left = num;
                }
            }

            while (left < right) {
                int mid = left + (right - left) / 2;
                int cnt = count(nums, mid);
                if (cnt <= m) { 
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return left;

        }

        public int count(int[] nums, int target) {
            int cnt = 1;
            int sum = 0;
            for (int num : nums) {
                if (sum + num > target) {
                    cnt++;
                    sum = num;
                } else {
                    sum += num;
                }
            }
            return cnt;
        }
    }

1011. 在D天内送达包裹的能力

// 和410题一样
class Solution {
        public int shipWithinDays(int[] weights, int days) {
            int left = 0;
            int right = 0;
            for (int num : weights) {
                right += num;
                if (left < num) {
                    left = num;
                }
            }

            while (left < right) {
                int mid = left + (right - left) / 2;
                int cnt = count(weights, mid);
                if (cnt <= days) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return left;

        }

        public int count(int[] nums, int target) {
            int cnt = 1;
            int sum = 0;
            for (int num : nums) {
                if (sum + num > target) {
                    cnt++;
                    sum = num;
                } else {
                    sum += num;
                }
            }
            return cnt;
        }
    }

122. 买卖股票的最佳时机II

// 利润等于每次加上上升时候的差值
class Solution {
        public int maxProfit(int[] prices) {
            int sum = 0;
            for (int i = 0; i < prices.length - 1; i++) {
                sum += Math.max(prices[i+1] - prices[i], 0);
            }
            return sum;
        }
    }

402. 移掉K位数字

// 单调栈即可
    class Solution {
        public String removeKdigits(String num, int k) {
            Deque<Character> deque = new ArrayDeque<>();
            for (char c : num.toCharArray()) {
                while (!deque.isEmpty() && k > 0 && deque.peekLast() > c) {
                    deque.pollLast();
                    k--;
                }
                deque.offer(c);
            }
            while (!deque.isEmpty() && k > 0) {
                deque.pollLast();
                k--;
            }
            StringBuilder sb = new StringBuilder();
            boolean flag = true;
            while (!deque.isEmpty()) {
                if (deque.peekFirst() == '0' && flag) {
                    deque.poll();
                    continue;
                }
                flag = false;
                sb.append(deque.poll());
            }
            return sb.length() == 0 ? "0" : sb.toString();
        }
    }

763. 划分字母区间

// 用数组记录每个字符的最远位置,然后遍历,记录当前遍历过字符的最远字符下标
class Solution {
    public List<Integer> partitionLabels(String s) {
        int n = s.length();
        int[] position = new int[26];
        for (int i = 0; i < n; i++) {
            int index = s.charAt(i) - 'a';
            position[index] = i;
        }

        int len = 0;
        int maxPosition = 0;
        List<Integer> res = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            len++;
            int index = s.charAt(i) - 'a';
            if (position[index] > maxPosition) maxPosition = position[index];
            if (i == maxPosition) {
                res.add(len);
                len = 0;
            }
        }
        return res;
    }
}

765. 情侣牵手

// 模拟交换即可,图论可用来解释
    class Solution {
        public int minSwapsCouples(int[] row) {
            int n = row.length;
            Map<Integer, Integer> map = new HashMap<>();
            for (int i = 0; i < n; i++) {
                map.put(row[i], i);
            }
            int res = 0;
            for (int i = 0; i < n; i += 2) {
                int cp = row[i] ^ 1;
                if (row[i + 1] != cp) {
                    res++;
                    int index = map.get(cp);
                    row[index] = row[i + 1];
                    map.put(row[index], index);
                }
            }
            return res;
        }
    }

409. 最长回文串

// 统计字符数量
class Solution {
    public int longestPalindrome(String s) {
        int[] counts = new int[128];
        for (char c : s.toCharArray()) {
            counts[c]++;
        }
        int sum = 0;
        for (int num : counts) {
            sum += num / 2 * 2;
        }
        if (sum < s.length()) sum++;
        return sum;
    }
}

44. 通配符匹配


316. 去除重复字母

// 单调栈 + flag数组
class Solution {
    public String removeDuplicateLetters(String s) {
        int[] counts = new int[26];
        boolean[] flag = new boolean[26];
        for (char c : s.toCharArray()) counts[c - 'a']++;
        Deque<Character> deque = new ArrayDeque<>();

        for (char c : s.toCharArray()) {
            int index = c - 'a';
            if (flag[index]) {
                counts[index]--;
                continue;
            }
            
            while (!deque.isEmpty() && deque.peekLast() > c) {
                if (counts[deque.peekLast() - 'a'] > 1) {
                    char out = deque.pollLast();
                    flag[out - 'a'] = false;
                    counts[out - 'a']--;
                } else {
                    break;
                }
            }
            flag[index] = true;
            deque.offer(c);      
        }
        StringBuilder sb = new StringBuilder();
        while (!deque.isEmpty()) {
            sb.append(deque.poll());
        }
        return sb.toString();
    }
}

680. 验证回文字符串Ⅱ

class Solution {
    public boolean validPalindrome(String s) {
        int lo = -1;
        int hi = s.length() ;
        while (++lo < --hi) {
            if (s.charAt(lo) != s.charAt(hi)) return validPalindrome(s, lo - 1, hi) || validPalindrome(s, lo, hi + 1);
        }
        return true;
    }

    public boolean validPalindrome(String s, int left, int right) {
        while (++left < --right) {
            if (s.charAt(left) != s.charAt(right)) return false;
        }
        return true;
    }
}

670. 最大交换

// 找到右边比左边第一个要大的值,交换即可
class Solution {
        public int maximumSwap(int num) {
            char[] digits = String.valueOf(num).toCharArray();
            int[] position = new int[10];
            for (int i = 0; i < digits.length; i++) {
                position[digits[i] - '0'] = i;
            }

            for (int i = 0; i < digits.length; i++) {
                int cur = digits[i] - '0';
                for (int k = 9; k > cur; k--) {
                    if (position[k] > i) {
                        char tmp = digits[i];
                        digits[i] = (char)('0' + k);   // 这里改成digits[position[k]]也行
                        digits[position[k]] = tmp;
                        return Integer.parseInt(new String(digits));
                    }
                }
            }
            return num;
        }
    }

435. 无重叠区间

// 左区间值排序
    class Solution {
        public int eraseOverlapIntervals(int[][] intervals) {
            Comparator<int[]> cmp = (x, y) -> {
                return x[0] - y[0];
            };
            Arrays.sort(intervals, cmp);
            int n = intervals.length;
            int res = 0;
            int left = intervals[n - 1][0];
            for (int i = n - 2; i >= 0; i--) {
                if (intervals[i][1] > left) {
                    res++;
                } else {
                    left = intervals[i][0];
                }
            }
            return res;
        }
    }

    // 右区间值排序
    class Solution0 {
        public int eraseOverlapIntervals(int[][] intervals) {
            Arrays.sort(intervals, (a, b) -> {
                if (a[1] == b[1]) return 0;
                else if (a[1] < b[1]) return -1;
                else return 1;
            });

            int right = intervals[0][1];
            int cnt = 0;
            for (int i = 1; i < intervals.length; i++) {
                if (intervals[i][0] < right) {
                    cnt++;
                } else {
                    right = intervals[i][1];
                }
            }
            return cnt;
        }
    }

406. 根据身高重建队列

// 左顺序,右降序,没插入个空位就是比现在插入的要大的
    class Solution {
        public int[][] reconstructQueue(int[][] people) {
            Comparator<int[]> cmp = (x, y) -> {
                return x[0] != y[0] ? x[0] - y[0] : y[1] - x[1];
            };
            Arrays.sort(people, cmp);

            int[][] res = new int[people.length][];
            for (int[] arr : people) {
                int cnt = arr[1];
                for (int i = 0; i < people.length && cnt >= 0; i++) {
                    if (res[i] == null) {
                        cnt--;
                    }
                    if (cnt == -1) {
                        res[i] = arr;
                    }
                }
            }
            return res;
        }
    }

    // 右降序,左顺新,插入法
    class Solution0 {
        public int[][] reconstructQueue(int[][] people) {
            Arrays.sort(people, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);

            ArrayList<int[]> link = new ArrayList<>();
            for (int[] arr : people) {
                if (arr[1] < link.size()) {
                    link.add(arr[1], arr);
                } else {
                    link.add(arr);
                }
            }
            return link.toArray(new int[people.length][]);
        }
    }

621. 任务调度器

// 桶思想 + 贪心
class Solution {
    public int leastInterval(char[] tasks, int n) {
        int[] counts = new int[26];
        for (char c : tasks) {
            counts[c - 'A']++;
        }

        Arrays.sort(counts);
        int buckets = counts[25];
        int maxCount = 1;
        for (int i = 25; i >= 1; i--) {
            if (counts[i] == counts[i - 1]) {
                maxCount++;
            } else {
                break;
            }
        }
        return Math.max(tasks.length, (buckets - 1) * (n + 1) + maxCount);
    }
}

611. 有效三角形的个数

    // 选排序后面用双指针,贪心策略为记录之前以一次指针的位置
    class Solution {
        public int triangleNumber(int[] nums) {
            int n = nums.length;
            Arrays.sort(nums);
            int res = 0;
            for (int i = 0; i < n - 2; i++) {
                int start = i + 2;
                for (int j = i + 1; j < n - 1 && nums[i] != 0; j++) {
                    while (start < n) {
                        if (nums[start] >= nums[i] + nums[j]) break;
                        start++;
                    }
                    res += start - j - 1;
                }
            }
            return res;
        }
    }

    // 先排序然后用二分法
    class Solution0 {
        public int triangleNumber(int[] nums) {
            int n = nums.length;
            Arrays.sort(nums);
            int res = 0;
            for (int i = 0; i < n - 2; i++) {
                for (int j = i + 1; j < n - 1; j++) {
                    int index = binarySearch(nums, j + 1, n, nums[i] + nums[j]);
                    res += index - j - 1;
                }
            }
        return res;
        }

        // 找小于x的最大值
        public int binarySearch(int[] nums, int left, int right, int x) {
            while (left < right) {
                int middle = left + (right - left) / 2;
                if (x <= nums[middle]) right = middle;
                else left = middle + 1;
            }
            return left;
        }
    }

    // 暴力能过90%用例左右
    class Solution1 {
        public int triangleNumber(int[] nums) {
            int n = nums.length;
            int res = 0;
            for (int i = 0; i < n - 2; i++) {
                int a = nums[i];
                for (int j = i + 1; j < n - 1;j++) {
                    int b = nums[j];
                    for (int k = j + 1; k < n;k++ ) {
                        int c = nums[k];
                        if (a + b > c && Math.abs(a - b) < c) {
                            res++;
                        }
                    }
                }
            }
            return res;
        }
    }

1353. 最多可以参加的会议数目,优先队列


1388. 3n块披萨,优先队列


605. 种花问题

    // 贪心,模拟,注意边界时的处理即可
    class Solution {
        public boolean canPlaceFlowers(int[] flowerbed, int n) {
            int cnt = 0;
            for (int i = 0; i < flowerbed.length && cnt < n; i++) {
                if (flowerbed[i] == 1) continue;
                int pre = i == 0 ? 0 : flowerbed[i-1];
                int next = i == flowerbed.length - 1 ? 0 : flowerbed[i+1];
                if (pre == 0 && next == 0) {
                    cnt++;
                    flowerbed[i] = 1;
                }
            }

            return cnt >= n;
        }
    }

253. 会议室II,优先队列


1262. 可被三整除的最大和

    // remainder[i] 表示除三余数为i的当前最大和
    class Solution {
        public int maxSumDivThree(int[] nums) {
            int[] remainder = new int[3];
            for (int num : nums) {
                int a = remainder[0] + num;
                int b = remainder[1] + num;
                int c = remainder[2] + num;
                remainder[a % 3] = Math.max(remainder[a % 3], a);
                remainder[b % 3] = Math.max(remainder[b % 3], b);
                remainder[c % 3] = Math.max(remainder[c % 3], c);
            }
            return remainder[0];
        }
    }

455. 分发饼干

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int res = 0;

        for (int i = 0, j = 0; i < g.length && j < s.length; j++) {   // 这个是遍历饼干,不是胃口
            if (s[j] >= g[i]) {
                i++;
                res++;
            }
        }
        return res;
    }
}

767. 重构字符串

    // 贪心,先排数量最多的字符,排在偶数下标,然后在排其他,注意排字符时的细节处理
    class Solution {
        public String reorganizeString(String s) {
            int n = s.length();
            int[] counts = new int[26];
            int maxCnt = 0;
            int maxCntIndex = 0;
            for (char c : s.toCharArray()) {
                counts[c - 'a']++;
                if(counts[c - 'a'] > maxCnt) {
                    maxCnt = counts[c - 'a'];
                    maxCntIndex = c - 'a';
                }
                if (maxCnt > (n + 1) / 2) return "";
            }

            int index = 0;
            char[] res = new char[n];
            for (int i = 0; i < maxCnt; i++) {
                res[index] = (char)(maxCntIndex + 'a');
                index += 2;
            }
            for (int i = 0; i < 26; i++) {
                while (counts[i]-- > 0 && i != maxCntIndex) {
                    if (index >= n) {
                        index = 1;
                    }
                    res[index] = (char)(i + 'a');
                    index += 2;
                }
            }
            return new String(res);
        }
    }

860. 柠檬水找零

 class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;
        for (int bill : bills) {
            if (bill == 5) {
                five++;
            } else if (bill == 10) {
                ten++;
                if (five > 0) five--;
                else return false;
            } else {
                if (ten > 0 && five > 0) {
                    ten--;
                    five--;
                } else if (five >= 3) {
                    five -= 3;
                } else {
                    return false;
                }
            }
        }
        return true;
    }
}

376. 摆动序列

class Solution {
    public int wiggleMaxLength(int[] nums) {
        int pre = 0;
        int res = 1;
        int n = nums.length;
        for (int i = 1; i < n; i++) {
            int cur = nums[i] - nums[i-1];
            if ((pre >= 0 && cur < 0) || (pre <= 0 && cur > 0)) {
                res++;
                pre = cur;   // 注意这里放里面,防止单调不增或者单调不减的情况
            }
        }
        return res;
    }
}

452. 用最少数量的箭引爆气球

// 对右端进行排序
class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (x, y) -> {
            return x[1] > y[1] ? 1 : -1;    // 排序不能用x[1] - y[1], 否则可能整数溢出
        });
        int right = points[0][1];
        int res = 1;
        for (int[] point : points) {
            if (point[0] > right) {
                res++;
                right = point[1];
            }
        }
        return res;
    }
}

330. 按要求补齐数组,困难遗留


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

    // 维护好buyPrice
    class Solution {
        public int maxProfit(int[] prices, int fee) {
            int buyPrice = prices[0] + fee;
            int profit = 0;
            for (int price : prices) {
                if (buyPrice > price + fee) {
                    buyPrice = price + fee;
                } else if (buyPrice < price) {
                    profit += price - buyPrice;
                    buyPrice = price;
                }
            }
            return profit;
        }
    }

581. 最短无序连续子数组

// 一次遍历
class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int first = -1;
        int last = -1;
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < max) {
                last = i;
            } else {
                max = nums[i];
            }

            int tmp = nums[nums.length - i - 1];
            if (tmp > min) {
                first = nums.length - i - 1;
            } else {
                min = tmp;
            }
        }
        return first == last ? 0 : last - first + 1;
    }
}

976. 三角形的最大周长

    class Solution {
        public int largestPerimeter(int[] nums) {
            Arrays.sort(nums);
            for (int i = nums.length - 1; i >= 2; i--) {
                if (nums[i - 1] + nums[i - 2] > nums[i]) {
                    return nums[i] + nums[i - 1] + nums[i - 2];
                }
            }
            return 0;
        }
    }

871. 最低加油次数,困难遗留


面试题10.11. 峰与谷

// 确定峰谷峰顺序,贪心交换即可
class Solution {
    public void wiggleSort(int[] nums) {
        for (int i = 1; i < nums.length; i++) {
            int pre = nums[i - 1];
            int cur = nums[i];
            if (i % 2 == 0) {
                if (cur < pre) {
                    nums[i] = pre;
                    nums[i - 1] = cur;
                }
            } else {
                if (cur > pre) {
                    nums[i] = pre;
                    nums[i - 1] = cur;
                }
            }
        }
    }
}

面试题16.16. 部分排序

// 同581题
class Solution {
    public int[] subSort(int[] array) {
        int first = -1;
        int last = -1;
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < array.length; i++) {
            if (array[i] < max) {
                last = i;
            } else {
                max = array[i];
            }

            int tmp = array[array.length - i - 1];
            if (tmp > min) {
                first = array.length - i - 1;
            } else {
                min = tmp;
            }
        }
        return new int[] {first, last};
    }
}

LCP15. 游乐园的迷宫,困难,遗留


1217. 玩筹码

class Solution {
    public int minCostToMoveChips(int[] position) {
        int odd = 0;
        int even = 0;
        for (int pos : position) {
            if ((pos & 1) == 0) {
                odd++;
            } else {
                even++;
            }
        }
        return Math.min(odd, even);
    }
}

561. 数组拆分I

class Solution {
    public int arrayPairSum(int[] nums) {
        Arrays.sort(nums);
        int sum = 0;
        for (int i = 0; i < nums.length; i += 2) {
            sum += nums[i];
        }
        return sum;
    }
}

1505. 最多K次交换相邻数位后得到的最小整数


LCP37. 最小矩形面积


502. IPO


945. 使数组唯一的最小增量


1363. 形成三的最大倍数


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容