Определите, содержат ли только две параллельные прямые все точки координат или нет
Дан массив, который представляет координаты y набора точек на координатной плоскости, где (i, arr [i]) представляет одну точку. Найдите, можно ли нарисовать пару параллельных линий, которые включают все заданные координатные точки, а также обе линии должны содержать точку. Выведите 1, если возможно, и 0, если невозможно.
Примеры:
Input: arr[] = {1, 4, 3, 6, 5};
Output: 1
(1, 1), (3, 3) and (5, 5) lie on one line
where as (2, 4) and (4, 6) lie on another line.
Input: arr[] = {2, 4, 3, 6, 5};
Output: 0
Minimum 3 lines needed to cover all points.
Подход: наклон линии, образованной точками (x1, y1) и (x2, y2), равен y2-y2 / x2-x1. Поскольку данный массив состоит из координат точек как (i, arr [i]). Итак, (arr [2] -arr [1]) / (2-1) - это наклон линии, образованной (1, arr [i]) и (2, arr [2]). Примите во внимание только три точки, например, P0 (0, arr [0]), P1 (1, arr [1]) и P2 (2, arr [2]), поскольку требуется только две параллельные линии, это обязательно что две из этих трех точек лежат на одной линии. Итак, возможны три случая:
- P0 и P1 находятся на одной прямой, поэтому их наклон будет arr [1] -arr [0]
 - P1 и P2 находятся на одной прямой, поэтому их наклон будет arr [2] -arr [1]
 - P0 и P2 находятся на одной прямой, поэтому их наклон будет arr [2] -arr [0] / 2
 
Возьмем один из трех случаев, скажем, P0 и P1 лежат на одной прямой, в этом случае пусть m = arr [1] -arr [0] - наш наклон. Для общей точки в массиве (i, arr [i]) уравнение прямой выглядит следующим образом:
=> (y-y1) = m (x-x1) => y-arr[i] = m (x-i) => y-mx = arr[i] - mi
Теперь, поскольку y-mx = c является общим уравнением прямой, здесь c = arr [i] -mi. Теперь, если решение будет возможным для данного массива, тогда у нас должно быть ровно два перехвата (c).
 Итак, если существуют два различных перехвата для любого из трех возможных вышеупомянутых, требуемое решение возможно и выведите 1 иначе 0.

Below is the implementation of the above approach:
C++
// C++ implementation of the above approach#include <bits/stdc++.h>using namespace std;// Find if slope is good with only two interceptbool isSlopeGood(double slope, int arr[], int n){    set<double> setOfLines;    for (int i = 0; i < n; i++)        setOfLines.insert(arr[i] - slope * (i));    // if set of lines have only two distinct intercept    return setOfLines.size() == 2;}// Function to check if required solution existbool checkForParallel(int arr[], int n){    // check the result by processing    // the slope by starting three points    bool slope1 = isSlopeGood(arr[1] - arr[0], arr, n);    bool slope2 = isSlopeGood(arr[2] - arr[1], arr, n);    bool slope3 = isSlopeGood((arr[2] - arr[0]) / 2, arr, n);    return (slope1 || slope2 || slope3);}// Driver codeint main(){    int arr[] = { 1, 6, 3, 8, 5 };    int n = sizeof(arr) / sizeof(arr[0]);    cout << (int)checkForParallel(arr, n);    return 0;} | 
Java
// Java implementation of the above approachimport java.util.*;class GfG{// Find if slope is good// with only two interceptstatic boolean isSlopeGood(double slope,                        int arr[], int n){    Set<Double> setOfLines = new HashSet<Double> ();    for (int i = 0; i < n; i++)        setOfLines.add(arr[i] - slope * (i));    // if set of lines have only two distinct intercept    return setOfLines.size() == 2;}// Function to check if required solution existstatic boolean checkForParallel(int arr[], int n){    // check the result by processing    // the slope by starting three points    boolean slope1 = isSlopeGood(arr[1] - arr[0], arr, n);    boolean slope2 = isSlopeGood(arr[2] - arr[1], arr, n);    boolean slope3 = isSlopeGood((arr[2] - arr[0]) / 2, arr, n);    return (slope1 == true || slope2 == true || slope3 == true);}// Driver codepublic static void main(String[] args){    int arr[] = { 1, 6, 3, 8, 5 };    int n = arr.length;    if(checkForParallel(arr, n) == true)    System.out.println("1");    else    System.out.println("0");}}// This code is contributed by Prerna Saini. | 
Python3
# Python3 implementation of the# above approach# Find if slope is good with only# two interceptdef isSlopeGood(slope, arr, n):    setOfLines = dict()    for i in range(n):        setOfLines[arr[i] - slope * (i)] = 1    # if set of lines have only    # two distinct intercept    return len(setOfLines) == 2# Function to check if required solution existdef checkForParallel(arr, n):         # check the result by processing    # the slope by starting three points    slope1 = isSlopeGood(arr[1] - arr[0], arr, n)    slope2 = isSlopeGood(arr[2] - arr[1], arr, n)    slope3 = isSlopeGood((arr[2] - arr[0]) // 2, arr, n)    return (slope1 or slope2 or slope3)# Driver codearr = [1, 6, 3, 8, 5 ]n = len(arr)if checkForParallel(arr, n):    print(1)else:    print(0)     # This code is contributed by Mohit Kumar    | 
C#
// C# implementation of the above approachusing System;using System.Collections.Generic;class GfG{// Find if slope is good// with only two interceptstatic bool isSlopeGood(double slope,                        int []arr, int n){    HashSet<Double> setOfLines = new HashSet<Double> ();    for (int i = 0; i < n; i++)        setOfLines.Add(arr[i] - slope * (i));    // if set of lines have only two distinct intercept    return setOfLines.Count == 2;}// Function to check if required solution existstatic bool checkForParallel(int []arr, int n){    // check the result by processing    // the slope by starting three points    bool slope1 = isSlopeGood(arr[1] - arr[0], arr, n);    bool slope2 = isSlopeGood(arr[2] - arr[1], arr, n);    bool slope3 = isSlopeGood((arr[2] - arr[0]) / 2, arr, n);    return (slope1 == true || slope2 == true || slope3 == true);}// Driver codepublic static void Main(){    int []arr = { 1, 6, 3, 8, 5 };    int n = arr.Length;    if(checkForParallel(arr, n) == true)        Console.WriteLine("1");    else        Console.WriteLine("0");}}// This code is contributed by Ryuga. | 
PHP
<?php// PHP implementation of the above approach// Find if slope is good with only// two interceptfunction isSlopeGood($slope, $arr, $n){    $setOfLines = array_fill(0, max($arr) * $n, 0);    for ($i = 0; $i < $n; $i++)        $setOfLines[$arr[$i] - $slope * $i] = 1;    $setOfLines = array_unique($setOfLines);         // if set of lines have only two    // distinct intercept    return (count($setOfLines) == 2);}// Function to check if required// solution existfunction checkForParallel($arr, $n){    // check the result by processing    // the slope by starting three points    $slope1 = isSlopeGood($arr[1] - $arr[0],                                    $arr, $n);    $slope2 = isSlopeGood($arr[2] - $arr[1],                                    $arr, $n);    $slope3 = isSlopeGood((int)(($arr[2] -                                 $arr[0]) / 2),                                 $arr, $n);    return ($slope1 || $slope2 || $slope3);}// Driver code$arr = array( 1, 6, 3, 8, 5 );$n = count($arr);echo (int)checkForParallel($arr, $n) . "
";// This code is contributed by mits?> | 
Javascript
<script>// Javascript implementation of the above approach// Find if slope is good with only two interceptfunction isSlopeGood(slope, arr, n){    var setOfLines = new Set();    for (var i = 0; i < n; i++)        setOfLines.add(arr[i] - slope * (i));    // if set of lines have only two distinct intercept    return setOfLines.size == 2;}// Function to check if required solution existfunction checkForParallel(arr, n){    // check the result by processing    // the slope by starting three points    var slope1 = isSlopeGood(arr[1] - arr[0], arr, n);    var slope2 = isSlopeGood(arr[2] - arr[1], arr, n);    var slope3 = isSlopeGood(parseInt((arr[2] - arr[0]) / 2), arr, n);    if(slope1 || slope2 || slope3)    {        return 1;    }    return 0;}// Driver codevar arr = [ 1, 6, 3, 8, 5 ];var n = arr.length;document.write( checkForParallel(arr, n));</script> | 
1
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.