精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇讓你學會組合問題!

開發 前端
直接的解法當然是使用for循環,例如示例中k為2,很容易想到 用兩個for循環,這樣就可以輸出 和示例中一樣的結果。

組合

力扣題目鏈接:https://leetcode-cn.com/problems/combinations/

給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。

示例: 輸入: n = 4, k = 2 輸出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

本題這是回溯法的經典題目。

直接的解法當然是使用for循環,例如示例中k為2,很容易想到 用兩個for循環,這樣就可以輸出 和示例中一樣的結果。

代碼如下:

  1. int n = 4; 
  2. for (int i = 1; i <= n; i++) { 
  3.     for (int j = i + 1; j <= n; j++) { 
  4.         cout << i << " " << j << endl; 
  5.     } 

輸入:n = 100, k = 3 那么就三層for循環,代碼如下:

  1. int n = 100; 
  2. for (int i = 1; i <= n; i++) { 
  3.     for (int j = i + 1; j <= n; j++) { 
  4.         for (int u = j + 1; u <= n; n++) { 
  5.             cout << i << " " << j << " " << u << endl; 
  6.         } 
  7.     } 

如果n為100,k為50呢,那就50層for循環,是不是開始窒息。

此時就會發現雖然想暴力搜索,但是用for循環嵌套連暴力都寫不出來!

咋整?

回溯搜索法來了,雖然回溯法也是暴力,但至少能寫出來,不像for循環嵌套k層讓人絕望。

那么回溯法怎么暴力搜呢?

上面我們說了要解決 n為100,k為50的情況,暴力寫法需要嵌套50層for循環,那么回溯法就用遞歸來解決嵌套層數的問題。

遞歸來做層疊嵌套(可以理解是開k層for循環),每一次的遞歸中嵌套一個for循環,那么遞歸就可以用于解決多層嵌套循環的問題了。

此時遞歸的層數大家應該知道了,例如:n為100,k為50的情況下,就是遞歸50層。

一些同學本來對遞歸就懵,回溯法中遞歸還要嵌套for循環,可能就直接暈倒了!

如果腦洞模擬回溯搜索的過程,絕對可以讓人窒息,所以需要抽象圖形結構來進一步理解。

我們在關于回溯算法,你該了解這些!中說道回溯法解決的問題都可以抽象為樹形結構(N叉樹),用樹形結構來理解回溯就容易多了。

那么我把組合問題抽象為如下樹形結構:

77.組合

可以看出這個棵樹,一開始集合是 1,2,3,4, 從左向右取數,取過的數,不在重復取。

第一次取1,集合變為2,3,4 ,因為k為2,我們只需要再取一個數就可以了,分別取2,3,4,得到集合[1,2] [1,3] [1,4],以此類推。

每次從集合中選取元素,可選擇的范圍隨著選擇的進行而收縮,調整可選擇的范圍。

圖中可以發現n相當于樹的寬度,k相當于樹的深度。

那么如何在這個樹上遍歷,然后收集到我們要的結果集呢?

圖中每次搜索到了葉子節點,我們就找到了一個結果。

相當于只需要把達到葉子節點的結果收集起來,就可以求得 n個數中k個數的組合集合。

在關于回溯算法,你該了解這些!中我們提到了回溯法三部曲,那么我們按照回溯法三部曲開始正式講解代碼了。

回溯法三部曲

遞歸函數的返回值以及參數

在這里要定義兩個全局變量,一個用來存放符合條件單一結果,一個用來存放符合條件結果的集合。

代碼如下:

  1. vector<vector<int>> result; // 存放符合條件結果的集合 
  2. vector<int> path; // 用來存放符合條件結果 

其實不定義這兩個全局遍歷也是可以的,把這兩個變量放進遞歸函數的參數里,但函數里參數太多影響可讀性,所以我定義全局變量了。

函數里一定有兩個參數,既然是集合n里面取k的數,那么n和k是兩個int型的參數。

然后還需要一個參數,為int型變量startIndex,這個參數用來記錄本層遞歸的中,集合從哪里開始遍歷(集合就是[1,...,n] )。

為什么要有這個startIndex呢?

每次從集合中選取元素,可選擇的范圍隨著選擇的進行而收縮,調整可選擇的范圍,就是要靠startIndex。

從下圖中紅線部分可以看出,在集合[1,2,3,4]取1之后,下一層遞歸,就要在[2,3,4]中取數了,那么下一層遞歸如何知道從[2,3,4]中取數呢,靠的就是startIndex。

組合2

所以需要startIndex來記錄下一層遞歸,搜索的起始位置。

那么整體代碼如下:

  1. vector<vector<int>> result; // 存放符合條件結果的集合 
  2. vector<int> path; // 用來存放符合條件單一結果 
  3. void backtracking(int n, int k, int startIndex) 

回溯函數終止條件

什么時候到達所謂的葉子節點了呢?

path這個數組的大小如果達到k,說明我們找到了一個子集大小為k的組合了,在圖中path存的就是根節點到葉子節點的路徑。

如圖紅色部分:

組合3

此時用result二維數組,把path保存起來,并終止本層遞歸。

所以終止條件代碼如下:

  1. if (path.size() == k) { 
  2.     result.push_back(path); 
  3.     return
  • 單層搜索的過程

回溯法的搜索過程就是一個樹型結構的遍歷過程,在如下圖中,可以看出for循環用來橫向遍歷,遞歸的過程是縱向遍歷。

組合1

如此我們才遍歷完圖中的這棵樹。

for循環每次從startIndex開始遍歷,然后用path保存取到的節點i。

代碼如下:

  1. for (int i = startIndex; i <= n; i++) { // 控制樹的橫向遍歷 
  2.     path.push_back(i); // 處理節點 
  3.     backtracking(n, k, i + 1); // 遞歸:控制樹的縱向遍歷,注意下一層搜索要從i+1開始 
  4.     path.pop_back(); // 回溯,撤銷處理的節點 

可以看出backtracking(遞歸函數)通過不斷調用自己一直往深處遍歷,總會遇到葉子節點,遇到了葉子節點就要返回。

backtracking的下面部分就是回溯的操作了,撤銷本次處理的結果。

關鍵地方都講完了,組合問題C++完整代碼如下:

  1. class Solution { 
  2. private: 
  3.     vector<vector<int>> result; // 存放符合條件結果的集合 
  4.     vector<int> path; // 用來存放符合條件結果 
  5.     void backtracking(int n, int k, int startIndex) { 
  6.         if (path.size() == k) { 
  7.             result.push_back(path); 
  8.             return
  9.         } 
  10.         for (int i = startIndex; i <= n; i++) { 
  11.             path.push_back(i); // 處理節點 
  12.             backtracking(n, k, i + 1); // 遞歸 
  13.             path.pop_back(); // 回溯,撤銷處理的節點 
  14.         } 
  15.     } 
  16. public
  17.     vector<vector<int>> combine(int n, int k) { 
  18.         result.clear(); // 可以不寫 
  19.         path.clear();   // 可以不寫 
  20.         backtracking(n, k, 1); 
  21.         return result; 
  22.     } 
  23. }; 

還記得我們在關于回溯算法,你該了解這些!中給出的回溯法模板么?

如下:

  1. void backtracking(參數) { 
  2.     if (終止條件) { 
  3.         存放結果; 
  4.         return
  5.     } 
  6.  
  7.     for (選擇:本層集合中元素(樹中節點孩子的數量就是集合的大?。? { 
  8.         處理節點; 
  9.         backtracking(路徑,選擇列表); // 遞歸 
  10.         回溯,撤銷處理結果 
  11.     } 

對比一下本題的代碼,是不是發現有點像! 所以有了這個模板,就有解題的大體方向,不至于毫無頭緒。

總結

組合問題是回溯法解決的經典問題,我們開始的時候給大家列舉一個很形象的例子,就是n為100,k為50的話,直接想法就需要50層for循環。

從而引出了回溯法就是解決這種k層for循環嵌套的問題。

然后進一步把回溯法的搜索過程抽象為樹形結構,可以直觀的看出搜索的過程。

接著用回溯法三部曲,逐步分析了函數參數、終止條件和單層搜索的過程。

剪枝優化

我們說過,回溯法雖然是暴力搜索,但也有時候可以有點剪枝優化一下的。

在遍歷的過程中有如下代碼:

  1. for (int i = startIndex; i <= n; i++) { 
  2.     path.push_back(i); 
  3.     backtracking(n, k, i + 1); 
  4.     path.pop_back(); 

這個遍歷的范圍是可以剪枝優化的,怎么優化呢?

來舉一個例子,n = 4,k = 4的話,那么第一層for循環的時候,從元素2開始的遍歷都沒有意義了。在第二層for循環,從元素3開始的遍歷都沒有意義了。

這么說有點抽象,如圖所示:

組合4

圖中每一個節點(圖中為矩形),就代表本層的一個for循環,那么每一層的for循環從第二個數開始遍歷的話,都沒有意義,都是無效遍歷。

所以,可以剪枝的地方就在遞歸中每一層的for循環所選擇的起始位置。

如果for循環選擇的起始位置之后的元素個數 已經不足 我們需要的元素個數了,那么就沒有必要搜索了。

注意代碼中i,就是for循環里選擇的起始位置。

  1. for (int i = startIndex; i <= n; i++) { 

接下來看一下優化過程如下:

已經選擇的元素個數:path.size();

還需要的元素個數為: k - path.size();

在集合n中至多要從該起始位置 : n - (k - path.size()) + 1,開始遍歷

為什么有個+1呢,因為包括起始位置,我們要是一個左閉的集合。

舉個例子,n = 4,k = 3, 目前已經選取的元素為0(path.size為0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。

從2開始搜索都是合理的,可以是組合[2, 3, 4]。

這里大家想不懂的話,建議也舉一個例子,就知道是不是要+1了。

所以優化之后的for循環是:

  1. for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i為本次搜索的起始位置 

優化后整體代碼如下:

  1. class Solution { 
  2. private: 
  3.     vector<vector<int>> result; 
  4.     vector<int> path; 
  5.     void backtracking(int n, int k, int startIndex) { 
  6.         if (path.size() == k) { 
  7.             result.push_back(path); 
  8.             return
  9.         } 
  10.         for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) { // 優化的地方 
  11.             path.push_back(i); // 處理節點 
  12.             backtracking(n, k, i + 1); 
  13.             path.pop_back(); // 回溯,撤銷處理的節點 
  14.         } 
  15.     } 
  16. public
  17.  
  18.     vector<vector<int>> combine(int n, int k) { 
  19.         backtracking(n, k, 1); 
  20.         return result; 
  21.     } 
  22. }; 

剪枝總結

本篇我們準對求組合問題的回溯法代碼做了剪枝優化,這個優化如果不畫圖的話,其實不好理解,也不好講清楚。

所以我依然是把整個回溯過程抽象為一顆樹形結構,然后可以直觀的看出,剪枝究竟是剪的哪里。

其他語言版本

Java

  1. class Solution { 
  2.     List<List<Integer>> result = new ArrayList<>(); 
  3.     LinkedList<Integer> path = new LinkedList<>(); 
  4.     public List<List<Integer>> combine(int n, int k) { 
  5.         combineHelper(n, k, 1); 
  6.         return result; 
  7.     } 
  8.  
  9.     /** 
  10.      * 每次從集合中選取元素,可選擇的范圍隨著選擇的進行而收縮,調整可選擇的范圍,就是要靠startIndex 
  11.      * @param startIndex 用來記錄本層遞歸的中,集合從哪里開始遍歷(集合就是[1,...,n] )。 
  12.      */ 
  13.     private void combineHelper(int n, int k, int startIndex){ 
  14.         //終止條件 
  15.         if (path.size() == k){ 
  16.             result.add(new ArrayList<>(path)); 
  17.             return
  18.         } 
  19.         for (int i = startIndex; i <= n - (k - path.size()) + 1; i++){ 
  20.             path.add(i); 
  21.             combineHelper(n, k, i + 1); 
  22.             path.removeLast(); 
  23.         } 
  24.     } 

Python

  1. class Solution: 
  2.     def combine(self, n: int, k: int) -> List[List[int]]: 
  3.         res=[]  #存放符合條件結果的集合 
  4.         path=[]  #用來存放符合條件結果 
  5.         def backtrack(n,k,startIndex): 
  6.             if len(path) == k: 
  7.                 res.append(path[:]) 
  8.                 return 
  9.             for i in range(startIndex,n+1): 
  10.                 path.append(i)  #處理節點 
  11.                 backtrack(n,k,i+1)  #遞歸 
  12.                 path.pop()  #回溯,撤銷處理的節點 
  13.         backtrack(n,k,1) 
  14.         return res 

Go

  1. var res [][]int 
  2. func combine(n int, k int) [][]int { 
  3.    res=[][]int{} 
  4.    if n <= 0 || k <= 0 || k > n { 
  5.   return res 
  6.  } 
  7.     backtrack(n, k, 1, []int{}) 
  8.  return res 
  9. func backtrack(n,k,start int,track []int){ 
  10.     if len(track)==k{ 
  11.         temp:=make([]int,k) 
  12.         copy(temp,track) 
  13.         res=append(res,temp
  14.     } 
  15.     if len(track)+n-start+1 < k { 
  16.    return 
  17.   } 
  18.     for i:=start;i<=n;i++{ 
  19.         track=append(track,i) 
  20.         backtrack(n,k,i+1,track) 
  21.         track=track[:len(track)-1] 
  22.     } 

 

責任編輯:武曉燕 來源: 代碼隨想錄
相關推薦

2021-08-26 13:22:46

雪花算法隨機數

2022-08-29 08:00:11

哈希表數組存儲桶

2022-02-11 08:45:28

通信協議CAN

2022-03-04 21:06:46

spring事務失效

2022-03-11 10:21:30

IO系統日志

2021-11-30 19:58:51

Java問題排查

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2024-04-12 09:01:08

2022-06-04 07:46:41

HeapJVM

2021-07-06 08:59:18

抽象工廠模式

2023-11-28 08:29:31

Rust內存布局

2023-01-03 08:31:54

Spring讀取器配置

2021-07-02 09:45:29

MySQL InnoDB數據

2022-08-23 08:00:59

磁盤性能網絡

2021-05-11 08:54:59

建造者模式設計

2022-08-26 09:29:01

Kubernetes策略Master

2021-07-05 22:11:38

MySQL體系架構

2022-04-12 08:30:52

回調函數代碼調試

2021-07-16 22:43:10

Go并發Golang
點贊
收藏

51CTO技術棧公眾號

最新日韩免费视频| 欧美视频在线播放一区| 国产福利第一视频| 欧美午夜不卡| 精品成人在线观看| 国产 福利 在线| aaa日本高清在线播放免费观看| 激情六月婷婷久久| 亚州欧美日韩中文视频| 蜜臀久久99精品久久久久久| 91精品在线免费视频| 亚洲五月六月丁香激情| 日韩福利视频| 国产精品无码AV| 国产精品日韩| 免费av一区二区| 草草影院第一页| 视频在线观看免费影院欧美meiju| 欧美日韩另类在线| 日本三日本三级少妇三级66| 日本私人网站在线观看| 国产精品一区专区| 国产精品久久久久久久久久尿| 青青草原免费观看| 成人女性视频| 亚洲成人久久久| 手机免费看av网站| 怡红院成人在线| 午夜免费久久看| 亚洲一区影院| 青青久在线视频| 丁香六月综合激情| 国产在线999| 亚洲无码精品一区二区三区| 99国产成+人+综合+亚洲欧美| 久久久国产一区二区| 中文字幕免费视频| 欧美三级电影在线| 欧美精品一区二区三区蜜臀| 伊人五月天婷婷| 激情欧美一区二区三区黑长吊| 亚洲午夜电影在线| 少妇大叫太大太粗太爽了a片小说| 日本在线视频网| 国产欧美日韩视频一区二区| 久久国产欧美精品| 婷婷色在线视频| 国产suv精品一区二区三区| 91麻豆国产语对白在线观看| 最新国产中文字幕| 免费看欧美女人艹b| 国产成人+综合亚洲+天堂| 亚洲日本韩国在线| 国产亚洲福利| 欧美孕妇性xx| 成人免费毛片男人用品| 美女视频一区免费观看| 欧美亚洲国产精品| 国产专区第一页| 噜噜噜在线观看免费视频日韩 | 婷婷成人综合网| 亚洲理论电影在线观看| av中文字幕在线观看第一页| 亚洲高清视频在线| 国产极品尤物在线| 亚洲黄色中文字幕| 91国模大尺度私拍在线视频| 成人免费在线观看视频网站| 国产精品蜜月aⅴ在线| 欧美三电影在线| 91精品999| 99视频这里有精品| 精品国产麻豆免费人成网站| 欧美xxxxx精品| 综合伊思人在钱三区| 在线播放日韩欧美| 波多野结衣久久久久| 黄色成人在线网址| 日本不卡免费高清视频| 中文字幕乱伦视频| 国产一区啦啦啦在线观看| 99re视频在线播放| 亚洲av成人无码久久精品老人| 久久精品夜色噜噜亚洲a∨| 亚洲成人自拍| 国产嫩草在线视频| 91久久精品一区二区三| 欧美大片久久久| 97久久精品| 国产一区二区精品丝袜| 青青草原免费观看| 午夜在线a亚洲v天堂网2018| 国产男人精品视频| 亚洲av综合色区无码一二三区 | 中文字幕在线看高清电影| 成人在线电影在线观看视频| 欧美插天视频在线播放| 国产原创视频在线| 精品一区二区久久| 精品午夜一区二区三区| 天堂аⅴ在线地址8| 亚洲第一在线综合网站| 亚洲天堂网一区| 国产精品成人自拍| www.亚洲成人| √资源天堂中文在线| 精品一区二区三区视频在线观看| 精品不卡一区二区三区| 日本在线免费| 精品免费在线视频| www激情五月| 国产麻豆精品久久| 欧美精品久久久久久久久| 五月婷婷激情五月| 波多野洁衣一区| 国产麻豆电影在线观看| 日韩精品专区| 亚洲成人在线网| 欧美一级特黄高清视频| 久久久久久黄| 激情欧美一区二区三区中文字幕| 激情视频在线观看| 欧美性猛交一区二区三区精品| 四虎成人免费视频| 先锋资源久久| 国产精品日韩在线观看| 欧美婷婷久久五月精品三区| 亚洲一区成人在线| www.久久com| 91视频久久| 国产精品露脸自拍| 欧美日韩在线中文字幕| 精品欧美aⅴ在线网站| 国产一级免费片| 中文字幕日韩一区二区不卡| 国产精品色午夜在线观看| 久草在线青青草| 欧美日韩性生活视频| 蜜臀aⅴ国产精品久久久国产老师| 久久精品欧美一区| 成人免费激情视频| 日韩专区在线| 欧美性生活一区| 国产成人免费观看网站| 视频一区视频二区中文字幕| 欧美精品国产精品久久久| 亚洲精品88| 日韩电影中文字幕av| 日本免费观看视| 波多野结衣在线一区| 国产91xxx| 亚洲男人都懂第一日本| 日韩美女免费线视频| 美州a亚洲一视本频v色道| 一本久久a久久精品亚洲| 国产亚洲一区二区精品| 中文字幕99| 久久精品国产福利| 日韩视频精品在线| av在线亚洲天堂| 亚洲欧美偷拍卡通变态| 四虎国产精品免费| 一区免费视频| 国内视频一区二区| 欧美1级2级| 中文字幕九色91在线| 亚洲视频一区在线播放| 亚洲欧洲精品一区二区三区| 欧美日韩理论片| 亚洲日本久久| 欧美一区二区综合| 欧美高清你懂的| 欧美夫妻性生活xx| 手机看片1024国产| 91黄色免费网站| 日韩高清dvd碟片| 成人午夜在线免费| 亚洲乱码中文字幕久久孕妇黑人| 久久久久久久久久久久久女过产乱| 一区二区不卡| 风间由美久久久| 在线天堂中文资源最新版| 国产小视频91| av中文字幕观看| 欧美日韩国产综合新一区| 丰腴饱满的极品熟妇| 老司机免费视频一区二区三区| 精品日韩在线播放| 日韩人体视频| 国产精品最新在线观看| 伦理av在线| 一本色道久久88综合日韩精品| 亚洲一线在线观看| 午夜欧美大尺度福利影院在线看| 一色道久久88加勒比一| 激情五月婷婷综合| 日韩久久一级片| 婷婷中文字幕一区| 久久精品日韩| 成人豆花视频| 欧洲亚洲在线视频| 成人av黄色| 亚洲人成欧美中文字幕| 国产av精国产传媒| 欧美自拍偷拍午夜视频| 精品无码免费视频| 国产精品久久久久一区二区三区| 亚洲精品无码一区二区| 久久国产成人午夜av影院| 精品久久久久久久久久中文字幕| 国产精品7m凸凹视频分类| 国产一区二区黄色| 日韩城人网站| 98精品国产自产在线观看| 麻豆网站在线观看| 亚洲视频777| 日本黄色不卡视频| 欧美高清一级片在线| 黄色av网站免费观看| 亚洲午夜私人影院| 亚洲不卡在线播放| 亚洲国产成人午夜在线一区| 中国av免费看| 粉嫩绯色av一区二区在线观看| 不卡的av中文字幕| 老司机精品久久| 法国空姐在线观看免费| 色天天久久综合婷婷女18| 久久久久久九九| 成人影院中文字幕| 99热在线播放| 精品中文字幕一区二区三区四区| 国产国产精品人在线视| 亚洲欧洲美洲av| 97免费视频在线| 久久99亚洲网美利坚合众国| 美日韩精品免费观看视频| 午夜在线视频播放| 亚洲欧美日韩视频一区| 亚洲色图 校园春色| 亚洲成人黄色网址| 日本韩国免费观看| 亚洲黄色片网站| 色噜噜在线播放| 欧美精品一区二区三区在线播放| www.亚洲黄色| 日韩三级精品电影久久久| 国产熟女一区二区丰满| 91精品国产乱| 一区二区的视频| 欧美日韩国产一区| 亚洲视频在线免费播放| 欧美人动与zoxxxx乱| 中文字幕有码视频| 欧美日韩亚洲综合一区二区三区 | 天天综合色天天| 日韩av一二三区| 午夜视频一区二区三区| 亚洲永久精品在线观看| 在线看一区二区| 亚洲无码久久久久| 欧美老肥妇做.爰bbww| 国产乱子伦精品无码码专区| 717成人午夜免费福利电影| av免费观看在线| 亚洲成人精品av| 九色国产在线观看| 中文字幕亚洲一区二区三区五十路| 又爽又大又黄a级毛片在线视频| 中文字幕欧美日韩va免费视频| 人人干在线视频| 欧美美女操人视频| 99久久精品免费看国产小宝寻花| 欧美亚洲日本网站| 久久精品国产福利| 成人免费在线看片| 亚洲动漫在线观看| 亚洲国产成人不卡| 欧美黄色aaaa| 尤物av无码色av无码| 久热精品视频| 特黄视频免费观看| 成人美女视频在线观看18| 女~淫辱の触手3d动漫| 国产精品欧美一区喷水| 欧美日韩国产精品综合| 岛国av一区二区| 国产尤物在线观看| 亚洲国产私拍精品国模在线观看| 邻居大乳一区二区三区| 久久这里只有精品视频首页| missav|免费高清av在线看| 国产精品美女午夜av| 在线一区二区三区视频| 日本一区视频在线| 欧美三级网页| 另类小说第一页| 成人美女在线观看| 自拍偷拍第9页| 五月激情丁香一区二区三区| 一本一道精品欧美中文字幕| 亚洲第一福利视频| 在线激情免费视频| 97视频免费看| 成人在线视频区| 欧美日韩一区二区三区免费| 欧美国产日本| 日韩av片网站| 91在线国内视频| 色欲人妻综合网| 在线亚洲免费视频| 色综合久久久久久| 久久人人爽人人爽爽久久| 免费亚洲电影| 国产精品国产亚洲精品看不卡15| 日本不卡免费一区| 1024精品视频| 国产传媒久久文化传媒| 后入内射无码人妻一区| 精品国产乱码久久久久久天美 | 精品国产视频在线观看| 色老汉一区二区三区| 日韩一级片免费| 欧美精品免费播放| 欧美亚洲福利| 日本在线视频一区| 久久精品中文| 亚洲精品女人久久久| 亚洲图片欧美色图| 国产高清免费在线观看| 久久国产一区二区三区| 成人免费福利| 欧美重口乱码一区二区| 在线亚洲自拍| 私密视频在线观看| 亚洲国产视频在线| 亚洲国产精品18久久久久久| 日韩视频免费在线观看| 日韩三区四区| 亚洲电影一二三区| 日韩不卡一二三区| 无码h肉动漫在线观看| 黑人欧美xxxx| 五月天婷婷在线播放| 性欧美长视频免费观看不卡 | 欧美精品尤物在线| 一区二区黄色| 青青草视频播放| 欧美视频一二三| 日本一区高清| 国产成人在线亚洲欧美| 精品视频99| 久久久久久久久久久久91| 日本一区二区三区在线观看| 中文字幕乱码中文字幕| 中文字幕精品—区二区| 影音成人av| 亚洲免费av网| 国产一区二区剧情av在线| 国模无码国产精品视频| 欧美成人三级在线| 丁香高清在线观看完整电影视频| 国产精品视频入口| 亚洲自啪免费| 国产高清一区二区三区四区| 欧美日韩一本到| v片在线观看| 国产精品亚洲综合| 午夜在线播放视频欧美| av在线播放中文字幕| 777a∨成人精品桃花网| 黄污视频在线观看| 欧美黑人3p| 久久99精品久久只有精品| 青青草原免费观看| 亚洲精品一区在线观看香蕉| 草莓视频成人appios| 久久观看最新视频| 99久久精品免费看国产| 91精品国产高清一区二区三密臀| 中日韩美女免费视频网址在线观看 | 国内精品麻豆美女在线播放视频 | 日韩av影片| 亚洲高清123| 国产成人av影院| 九九精品免费视频| 久久精品国产亚洲一区二区| 国产成人精品亚洲线观看| 国产精品久久久久9999小说| 亚洲靠逼com| 欧洲天堂在线观看| 97超级碰碰| 久久亚洲色图| 日本老熟俱乐部h0930| 亚洲乱码一区av黑人高潮| 不卡一区视频| 国产精品va无码一区二区| 中文字幕一区二区三区蜜月| 午夜在线视频免费| 91免费看国产|