牛客NC86 矩阵元素查找【中等 分治,减治 C++/Java/Go/PHP】

题目

题目链接:

https://www.nowcoder.com/practice/3afe6fabdb2c46ed98f06cfd9a20f2ce

思路

复制代码
选择左下角为起点,以下展示了「减治」的过程。
搜索的规律是:

如果当前数比目标元素小,当前列就不可能存在目标值,「指针」就向右移一格(纵坐标加 1);
如果当前数比目标元素大,当前行就不可能存在目标值,「指针」就向上移一格(横坐标减 1)。
在编码的过程中要注意数组下标越界的问题。

参考答案C++

cpp 复制代码
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param mat int整型vector<vector<>> 
     * @param n int整型 
     * @param m int整型 
     * @param x int整型 
     * @return int整型vector
     */
    vector<int> findElement(vector<vector<int> >& mat, int n, int m, int x) {
        /*
           选择左下角为起点,以下展示了「减治」的过程。
           搜索的规律是:

           如果当前数比目标元素小,当前列就不可能存在目标值,「指针」就向右移一格(纵坐标加 1);
           如果当前数比目标元素大,当前行就不可能存在目标值,「指针」就向上移一格(横坐标减 1)。
           在编码的过程中要注意数组下标越界的问题。
            */
        // 起点:左下角
        int currow = n-1;
        int curcol = 0;

        // 不越界的条件是:行大于等于 0,列小于等于 cols - 1
        vector<int> ans = {-1,-1};
        while (currow >=0 && curcol<m){
            if(mat[currow][curcol] >x ){
                currow-=1;
            }else if(mat[currow][curcol] <x){
                curcol+=1;
            }else{
                ans[0] =currow;
                ans[1] =curcol;
                break;
            }
        }
        return ans;
    }
};

参考答案Java

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param mat int整型二维数组
     * @param n int整型
     * @param m int整型
     * @param x int整型
     * @return int整型一维数组
     */
    public int[] findElement (int[][] mat, int n, int m, int x) {
        /*
             选择左下角为起点,以下展示了「减治」的过程。
             搜索的规律是:

             如果当前数比目标元素小,当前列就不可能存在目标值,「指针」就向右移一格(纵坐标加 1);
             如果当前数比目标元素大,当前行就不可能存在目标值,「指针」就向上移一格(横坐标减 1)。
             在编码的过程中要注意数组下标越界的问题。
              */
        // 起点:左下角
        int currow = n - 1;
        int curcol = 0;

        // 不越界的条件是:行大于等于 0,列小于等于 cols - 1
        while (currow >= 0 && curcol < m) {
            if (mat[currow][curcol] > x) {
                currow -= 1;
            } else if (mat[currow][curcol] < x) {
                curcol += 1;
            } else {
                return new int[] {currow, curcol};
            }
        }

        return new int[] {-1, -1};
    }
}

参考答案Go

go 复制代码
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param mat int整型二维数组
 * @param n int整型
 * @param m int整型
 * @param x int整型
 * @return int整型一维数组
 */
func findElement(mat [][]int, n int, m int, x int) []int {
	/*
	   选择左下角为起点,以下展示了「减治」的过程。
	   搜索的规律是:

	   如果当前数比目标元素小,当前列就不可能存在目标值,「指针」就向右移一格(纵坐标加 1);
	   如果当前数比目标元素大,当前行就不可能存在目标值,「指针」就向上移一格(横坐标减 1)。
	   在编码的过程中要注意数组下标越界的问题。
	*/
	// 起点:左下角
	currow := n - 1
	curcol := 0

	ans := []int{-1, -1}
	// 不越界的条件是:行大于等于 0,列小于等于 cols - 1
	for currow >= 0 && curcol < m {
		if mat[currow][curcol] > x {
			currow -= 1
		} else if mat[currow][curcol] < x {
			curcol += 1
		} else {
			ans[0] = currow
			ans[1] = curcol
			break
		}
	}
	return ans
}

参考答案PHP

php 复制代码
<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param mat int整型二维数组 
 * @param n int整型 
 * @param m int整型 
 * @param x int整型 
 * @return int整型一维数组
 */
function findElement( $mat ,  $n ,  $m ,  $x )
{
     /*
    选择左下角为起点,以下展示了「减治」的过程。
    搜索的规律是:

    如果当前数比目标元素小,当前列就不可能存在目标值,「指针」就向右移一格(纵坐标加 1);
    如果当前数比目标元素大,当前行就不可能存在目标值,「指针」就向上移一格(横坐标减 1)。
    在编码的过程中要注意数组下标越界的问题。
 */
    // 起点:左下角
    $currow = $n-1;
    $curcol = 0;

    $ans = [-1,-1];
    while ($currow >=0 && $curcol < $m){
        if($mat[$currow][$curcol] > $x) {
            $currow-=1;
        }else if($mat[$currow][$curcol] < $x){
            $curcol+=1;
        }else{
            $ans[0] =$currow;
            $ans[1] =$curcol;
            break;
        }
    }
    return $ans;
}
相关推荐
xsyaaaan9 分钟前
代码随想录Day31动态规划:1049最后一块石头的重量II_494目标和_474一和零
算法·动态规划
Jay Kay1 小时前
GVPO:Group Variance Policy Optimization
人工智能·算法·机器学习
Epiphany.5561 小时前
蓝桥杯备赛题目-----爆破
算法·职场和发展·蓝桥杯
YuTaoShao1 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法三)DP 空间优化
算法·leetcode·职场和发展
茉莉玫瑰花茶1 小时前
C++ 17 详细特性解析(5)
开发语言·c++·算法
cpp_25012 小时前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_25012 小时前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
uesowys2 小时前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法
季明洵2 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi2 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公