[解题报告]【第25题】求所有 1 到 5 的全排列 | 令人窒息的 for 循环

简介: [解题报告]【第25题】求所有 1 到 5 的全排列 | 令人窒息的 for 循环

全文目录

 零、写在前面

 一、主要知识点

          全排列的求法

 二、课后习题

          392. 判断子序列

          240. 搜索二维矩阵 II

          2006. 差的绝对值为 K 的数对数目

写在最后

零、写在前面

今天是c语言基础打卡的第25天,今天我尝试使用markdown来编辑这些内容完善这部分的所有题解吧。

【第25题】求所有 1 到 5 的全排列 | 令人窒息的 for 循环


一、主要知识点

多层for循环


全排列的求法

求1-5的全排列


int h[6];
int main() {
    int i, j, k, l, m;
    for(i = 1; i <= N; ++i) {
        h[i] = 1;                               //标记i  
        for(j = 1; j <= N; ++j) {
            if(h[j]) continue;                   //判断是否重复
            h[j] = 1;
            for(k = 1; k <= N; ++k) {
                if(h[k]) continue;               //判断是否重复
                h[k] = 1;
                for(l = 1; l <= N; ++l) {
                    if(h[l]) continue;           //判断是否重复
                    h[l] = 1; 
                    for(m = 1; m <= N; ++m) {
                          if(h[m]) continue;     //判断是否重复
                          printf("%d%d%d%d%d\n", i, j, k, l, m);
                    }
                    h[l] = 0;                    //还原
                }
                h[k] = 0;                        //还原
            }
            h[j] = 0;                            //还原
        }
        h[i] = 0;                                //还原
    }
    return 0;
}


二、课后习题

392. 判断子序列

392. 判断子序列


给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。


解题思路


根据要求依次判断就好了,但是要注意边界情况。


bool isSubsequence(char * s, char * t){
    if(!t[0]&&!s[0])  return true;//都是空串
    else if(!t[0])  return  false;//只有目标串是空串
    int low = 0,high = 0;//开始对比
    while(s[low]&&t[high]){
        while(t[high]&&s[low] != t[high]) high++;//不同则继续往后找
        if(!t[high]) return false;//high已经到末尾了 但是low还没
        low++;high++;//两者同时往后走
    }
    if(!s[low]) return true;//low到末尾了说明匹配完结
    return false;
}


240. 搜索二维矩阵 II

240. 搜索二维矩阵 II


编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:


每行的元素从左到右升序排列。

每列的元素从上到下升序排列。

解题思路


一开始的思路肯定是从右小角开始判断,但是能排除的情况会很复杂。

但是换一个思路,从右上角开始判断的话,每次都能消去一行或者一列。当超出表示范围的时候就说明没找到。


bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int row = matrixColSize[0] -1,col = 0;//查找的初始位置
    while(row>=0 && col < matrixSize){
        if(matrix[col][row] > target)   row--;//大于 消去一列往左走
        else if(matrix[col][row] < target)  col++;//小于 消去一行往下走
        else return true;
    }
    return false;
}


2006. 差的绝对值为 K 的数对数目

2006. 差的绝对值为 K 的数对数目


给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。

|x| 的值定义为:


如果 x >= 0 ,那么值为 x 。

如果 x < 0 ,那么值为 -x 。

解题思路


简单的双循环。

int countKDifference(int* nums, int numsSize, int k){
    int i,j,x;
    int t = 0;
    for(i=0;i<numsSize;i++)
    {
        for(j=i+1;j<numsSize;j++)
        {
           x=nums[i]-nums[j];
           if(x>0) x=x; //取绝对值
           else  x=-x;
           if(x==k) t++;  //是否满足要求
        }
    }
    return t;
}



相关文章
|
9天前
|
存储
全排列问题
全排列问题
|
4月前
【每日一题Day259】LC167两数之和 II - 输入有序数组 | 双指针 二分查找
【每日一题Day259】LC167两数之和 II - 输入有序数组 | 双指针 二分查找
35 0
|
9月前
|
C++
1199:全排列
1199:全排列
110 0
|
7月前
|
算法
LeetCode 37 解数独 循环+回溯算法
LeetCode 37 解数独 循环+回溯算法
38 0
|
7月前
全排列
全排列,
22 0
|
10月前
剑指offer_递归与循环---扑克牌顺子
剑指offer_递归与循环---扑克牌顺子
32 0
|
10月前
剑指offer_递归与循环---跳台阶
剑指offer_递归与循环---跳台阶
36 0
|
11月前
|
算法 Java
判断回文串(hdu 2029)双指针法
题目来自 hdu 杭州电子科技大学的一个算法网站
|
机器学习/深度学习 算法
do while循环以及一些题目
do while循环以及一些题目
81 0